【发布时间】:2012-10-01 19:43:47
【问题描述】:
我正在编写一个 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; }
webservice 方法如下所示:
[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 模式
【问题讨论】:
-
OrderResult Execute(OrderRequest order)不返回任何内容。另外,MyRequest是否实现了IMyRequest支持的所有内容? -
是否有关于儿童的数据合同/数据成员?
-
我有一个扩展抽象 CustomerId 的具体类。它被称为“CustomerIdByAccount”,它有一个公共属性“AccountId”。我使用用于请求的示例 XML 更新了问题
-
OrderResult和AnotherComplexType也需要是 DataContracts。 -
它们是数据合约。 CustomerId 是 ICustomerId 类型的数据成员,反序列化器似乎不理解 CustomerIdByAccount 是实现该接口的已知类型。