C# 我可以公开WCF ServiceContract中的数据成员吗?

C# 我可以公开WCF ServiceContract中的数据成员吗?,c#,.net,wcf,datacontract,servicecontract,C#,.net,Wcf,Datacontract,Servicecontract,在WCF服务中,是否可以在ServiceContract定义中包含数据成员?这样做: namespace My.Service.Contracts { [ServiceContract] public interface IMyService { [OperationContract] ResultObject[] Search(SearchParams searchParams); [DataMember]

在WCF服务中,是否可以在ServiceContract定义中包含数据成员?这样做:

namespace My.Service.Contracts
{
    [ServiceContract]
    public interface IMyService
    {
        [OperationContract]
        ResultObject[] Search(SearchParams searchParams);

        [DataMember]
        MyCustomClass MyDataMember { get; }
    }
}
我可以从ServiceContract内部公开MyDataMember吗?场景是这样的:下面的类实现了服务契约,它包含我希望使用公共字段/属性公开的成员数据。看起来像这样的东西: 我试图在实现服务契约的类中公开一个字段/属性。例如:

public class MyService : IMyService
{
    private MyCustomClass _datafield;

    ResultObject[] Search(SearchParams searchParams){
        //Do the search
    }

    MyCustomClass MyDataMember {
      get: { return _dataField; }
    }
}

您不能继承
DataMember
属性

定义是

虽然这在技术上并不限制您使用
DataMember
属性装饰接口成员,但是您也必须使用此属性装饰实现类成员

这不是预期的使用方式。

是否可以在ServiceContract定义中包含数据成员

尽管编译器会很乐意让您向服务接口“添加”一个用
[DataMember]
修饰的属性,但任何WCF客户端都不会看到该属性

因此,如果您的服务接口定义为:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    ResultObject[] Search(SearchParams searchParams);

    [DataMember]
    MyCustomClass MyDataMember { get; }
}
…假设您通过添加服务引用生成了客户端代理,那么您将不会看到对MyDataMember的任何提及:

注意,在添加服务引用时,您也不会看到任何属性

向服务接口添加属性没有意义,添加
[DataMember]
也没有意义。将
[DataMember]
添加到用
[DataContract]
装饰并在服务界面中引用的类中

MSDN在数据合同中有这样的表述:

数据契约是服务和客户端之间的正式协议,抽象地描述要交换的数据。也就是说,为了通信,客户机和服务不必共享相同的类型,只需共享相同的数据契约。数据协定精确地定义了每个参数或返回类型要交换的序列化(转换为XML)数据。-

WCF本质上是关于调用方法的(实际上,它更多地是关于创建一个统一的通信API,使您能够将RPC作为一个自由的方法集)。方法通常通过向服务发送SOAP消息来调用(尽管也可以是REST)。消息具有用
[DataMember]
修饰的属性,以指示该属性应序列化并包含在消息流中。还有
[MessageContract]
,但我们不会去那里

无论如何,您不会访问WCF服务上的“属性”,而是调用一个方法

告诉我更多 要了解更多关于史诗般的WCF,为什么不看看下面的链接呢。下面还有一个很好的例子:

  • MSDN“

您在这方面的目标是什么?您必须通过[OperationContract]调用返回数据,并通过其他调用将数据传递回。编辑问题@ChrisFThank You@MickyD。你的回答有道理。编译器/IDE的容差让我感到困惑。这是否意味着我必须改变我的类设计,将我希望从WCF客户端访问的所有数据与实现服务契约的类完全分离?@baha是的。将数据定义放入
[DataContract]
类中。您已经有了一个
MyCustomClass
,所以只需将
[DataContract]
添加到它,并将
[DataMember]
添加到每个属性。然后在服务界面中定义方法,如
MyCustomClass-Get(inti)
void-DoSomething(MyCustomClass-foo)
感谢您的全面回答
[ServiceContract]
public interface IMyService
{
    [OperationContract]
    ResultObject[] Search(SearchParams searchParams);

    [DataMember]
    MyCustomClass MyDataMember { get; }
}