我正在开发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继承的其他类?
答案 0 :(得分:0)
我相信已经找到了答案。看来我需要的是KnownType属性:
[DataContract]
[KnownType(typeof(OriginalConfirmRequest))]
[KnownType(typeof(OriginalLoadRequest))]
[KnownType(typeof(OriginalRedeemRequest))]
[KnownType(typeof(OriginalVoidRequest))]
public class OriginalRequest
{
[DataMember]
public MessageHeader MsgHeader { get; set; }
}
这个类似的问题帮助: How to return a List<object> in WCF