C# 我可以公开WCF ServiceContract中的数据成员吗?
在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]
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“
[DataContract]
类中。您已经有了一个MyCustomClass
,所以只需将[DataContract]
添加到它,并将[DataMember]
添加到每个属性。然后在服务界面中定义方法,如MyCustomClass-Get(inti)
和void-DoSomething(MyCustomClass-foo)
感谢您的全面回答
[ServiceContract]
public interface IMyService
{
[OperationContract]
ResultObject[] Search(SearchParams searchParams);
[DataMember]
MyCustomClass MyDataMember { get; }
}