在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; }
}
}
答案 0 :(得分:5)
是否可以在ServiceContract定义中包含数据成员?
虽然编译器很乐意让你'#34;添加"用[DataMember]
装饰到服务接口的属性,任何WCF客户端都不会看到该属性。
因此,如果您的服务接口定义为:
[ServiceContract]
public interface IMyService
{
[OperationContract]
ResultObject[] Search(SearchParams searchParams);
[DataMember]
MyCustomClass MyDataMember { get; }
}
...并说您通过添加服务参考生成了客户端代理,您将看不到MyDataMember
:
注意,在添加服务引用时,您也不会看到任何属性。
向服务接口添加属性没有意义,添加[DataMember]
也没有意义。您将[DataMember]
添加到装饰有[DataContract]
的类中,并在您的服务界面中引用。
数据合同是服务和客户之间的正式协议,它抽象地描述了要交换的数据。也就是说,为了进行通信,客户端和服务不必共享相同的类型,只需要相同的数据合同。数据协定为每个参数或返回类型精确定义了要交换的序列化(转换为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
属性修饰接口成员,但是您也必须使用此属性修饰实现类成员。
这不是预期的使用方式。