我正在开发一个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; }
}
我有一个测试客户端程序,使用服务生成的WSDL中的SvcUtil创建。我的问题是,从WSDL生成的代码只包含OriginalRequest,而不是像OriginalLoadRequest那样继承自OriginalRequest的类,可能是因为在接口中没有对这些类的引用。我尝试在接口中添加一个重载,如下所示:
[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; }
}
这个类似的问题有助于:How to return a List<object> in WCF