我正在编写一个 WCF Web 服务并传入一个复杂类型作为方法的参数。复杂类型如下所示:
[DataContract(Namespace = "")]
public class MyRequest
{
[DataMember()]
public string TransactionId { get; set; }
[DataMember(IsRequired = true)]
public bool IsRollback { get; set; }
[DataMember(IsRequired = true)]
public OrderType OrderType { get; set; }
[DataMember(IsRequired = true)]
public ICustomerId CustomerId { get; set; }
[DataMember()]
public long OrderId { get; set; }
[DataMember()]
public AnotherComplexType PurchaseInfo { get; set; }
网络服务方法如下所示:
[ServiceKnownType(typeof(CustomerIdByName))]
[ServiceKnownType(typeof(CustomerIdByAccount))]
public OrderResult Execute(MyRequest order) {
}
界面如下所示:
[KnownType(typeof(CustomerIdByAccount))]
[KnownType(typeof(CustomerIdByName))]
public interface ICustomerId{
string GetId();
}
当我使用 SOAP 端点发出请求时,一切正常。但是当将请求传递到 REST 端点时,我得到了序列化错误。
这是我正在使用的请求
<MyRequest>
<CustomerId>
<AccountId>59251</AccountId>
</CustomerId>
<IsRollback>false</IsRollback>
<OrderId>0</OrderId>
<OrderType>OrderSubscription</OrderType>
<PurchaseInfo>
<ObjectId>196521</ObjectId>
</PurchaseInfo>
<TransactionId>ABC123</TransactionGuid>
</MyRequest>
由于我在这一点上卡住了太久,所以我将 ICustomerId 成员更改为实现 ICustomerId 的抽象类。SOAP 端点再次正常工作,但将请求发送到其余端点我收到一条错误消息,指出“无法创建抽象类”
我在这里错过了什么或做错了什么?
这是因为接口嵌套在复杂类型中而不是webservice方法的直接参数而失败吗?我使用了接收接口作为参数的 web 服务,并且使用 KnownType 装饰器它们工作得很好。同样的问题也适用于抽象类,这是否不起作用,因为抽象类嵌套在 MyRequest 复杂类型的成员中?
这是我收到的错误消息:
命名空间中的元素 CustomerId 不能将子内容反序列化为对象。请使用 XmlNode[] 反序列化这种 XML 模式