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

时间:2016-02-10 12:34:49

标签: c# .net wcf datacontract servicecontract

在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; }
    }
}

2 个答案:

答案 0 :(得分:5)

  

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

虽然编译器很乐意让你'#34;添加"用[DataMember]装饰到服务接口的属性,任何WCF客户端都不会看到该属性。

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

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

    [DataMember]
    MyCustomClass MyDataMember { get; }
}

...并说您通过添加服务参考生成了客户端代理,您将看不到MyDataMember

enter image description here

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

enter image description here

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

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

  

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

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

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

告诉我更多

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

答案 1 :(得分:1)

您无法继承DataMember属性。

定义为on msdn

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

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

这不是预期的使用方式。