[英]WCF Service Contracts and Data Contracts
我正在开发WCF服务。 该服务必须支持的方法由第三方定义。 定义服务合同的接口部分看起来像这样:
[SoapHeaders]
[ServiceContract(Namespace ="abc.xyz")]
public interface IAbcSoap
{
[SoapHeader("AuthenticationHeader",
typeof(AuthenticationHeader),
Direction = SoapHeaderDirection.In)]
[OperationContract(Action = "abc.xyz/ReverseCard")]
ReverseCardResponse ReverseCard(
OriginalRequest OriginalRequest);
定义数据协定的类包括OriginalRequest和继承自OriginalRequest的其他几种特定类型,如下所示:
[DataContract]
public class OriginalRequest
{
[DataMember]
public MessageHeader MsgHeader { get; set; }
}
[DataContract]
public class OriginalLoadRequest : OriginalRequest
{
[DataMember]
public long ProductCode { get; set; }
}
我有一个测试客户端程序,该程序是使用SvcUtil根据服务生成的WSDL创建的。 我的问题是,从WSDL生成的代码仅包含OriginalRequest,而不包含从OriginalRequest继承的类似OriginalLoadRequest之类的类,大概是因为在接口中没有对这些类的引用。 我试图像这样向接口添加重载:
[OperationContract(Action = "abc.xyz/ReverseCard")]
ReverseCardResponse ReverseCard(
OriginalRequest OriginalLoadRequest);
但这会在尝试生成WSDL时导致错误。 如果我理解正确,这是因为我不能同时执行两种方法。 但是动作是由第三方定义的。 我无法改变这一点。
如何使客户端程序知道OriginalLoadRequest和其他继承自OriginalRequest的类?
你超载
[OperationContract(Action = "abc.xyz/ReverseCard")]
ReverseCardResponse ReverseCard(
OriginalRequest OriginalLoadRequest);
您是否没有获得正确的参数类型并以错误的方式命名,即不应该
OriginalLoadRequest OriginalRequest);
甚至
OriginalLoadRequest OriginalLoadRequest);
我相信我已经找到了答案。 看起来我需要的是KnownType属性:
[DataContract]
[KnownType(typeof(OriginalConfirmRequest))]
[KnownType(typeof(OriginalLoadRequest))]
[KnownType(typeof(OriginalRedeemRequest))]
[KnownType(typeof(OriginalVoidRequest))]
public class OriginalRequest
{
[DataMember]
public MessageHeader MsgHeader { get; set; }
}
这个类似的问题帮助: 如何在WCF中返回List <object>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.