4

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

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

        [DataMember]
        MyCustomClass MyDataMember { get; }
    }
}

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

public class MyService : IMyService
{
    private MyCustomClass _datafield;

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

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

2 回答 2

7

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

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

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

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

    [DataMember]
    MyCustomClass MyDataMember { get; }
}

...并假设您通过Add Service Reference生成了客户端代理,您将看不到以下内容MyDataMember

在此处输入图像描述

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

在此处输入图像描述

向服务接口添加属性没有意义,添加[DataMember]. 你添加[DataMember]到一个用你的服务接口装饰[DataContract]和引用的类。

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

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

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

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

告诉我更多

要了解有关 WCF 的史诗性的更多信息,为什么不查看下面的链接。底部甚至还有一个相当不错的例子:

于 2016-02-10T12:58:54.737 回答
1

你不能继承DataMember属性。

定义在 msdn 上

[AttributeUsageAttribute(AttributeTargets.Property|AttributeTargets.Field, Inherited = false,AllowMultiple = false)]
public sealed class DataMemberAttribute : Attribute

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

这不是预期的使用方式。

于 2016-02-10T12:38:35.107 回答