我可以在WCF ServiceContract中公开数据成员吗?

Bah*_*haa 4 .net c# wcf datacontract servicecontract

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

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

        [DataMember]
        MyCustomClass MyDataMember { get; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以MyDataMember从ServiceContract内部公开吗?场景将如下所示:实现服务契约的以下类具有我想使用公共字段/属性公开的成员数据.看起来像这样的东西:我试图在实现服务合同的类中公开一个字段/属性.例如:

public class MyService : IMyService
{
    private MyCustomClass _datafield;

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

    MyCustomClass MyDataMember {
      get: { return _dataField; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*kyD 7

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

虽然编译器很乐意让您"添加" [DataMember]服务接口所装饰的属性,但任何WCF客户端都不会看到该属性.

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

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

    [DataMember]
    MyCustomClass MyDataMember { get; }
}
Run Code Online (Sandbox Code Playgroud)

...并且说你通过添加服务参考生成客户端代理,你会看到没有提到MyDataMember:

在此输入图像描述

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

在此输入图像描述

向服务接口添加属性没有意义,添加也没有意义[DataMember].您添加[DataMember][DataContract]服务界面中装饰和引用的类.

MSDN对数据合同有这样的说法:

数据协定是服务和客户之间的正式协议,它抽象地描述要交换的数据.也就是说,为了进行通信,客户端和服务不必共享相同的类型,只需要相同的数据合同.对于每个参数或返回类型,数据协定精确定义了要交换的序列化(转换为XML)的数据.- Golly,告诉我更多......

WCF基本上都是关于调用方法的(实际上它更多的是创建一个统一的通信API,将RPC作为免费的牛排刀组).通常通过向服务发送SOAP消息来调用方法(尽管它也可以是REST).消息具有用于装饰的属性,[DataMember]以指示属性应序列化并包含在消息流中.还有,[MessageContract]但我们不会去那里.

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

告诉我更多

要了解有关WCF史诗的更多信息,请查看以下链接.底部甚至有一个相当不错的例子: