3

我正在编写一个 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 模式

4

1 回答 1

0

您是否尝试过将界面装饰为 RESTful 方法?

[ServiceContract]
public interface IMyRequest
{
    [OperationContract]
    [WebInvoke(
       UriTemplate = "Requests/GetID",
       Method = "POST",
       BodyStyle = WebMessageBodyStyle.Wrapped)]
    string GetId(MyRequest myRequest);
...

还:

  • 确保 [DataMember] 属性与您的请求负载匹配。在您的 XML 请求负载中传递的所有内容都必须由服务中的序列化程序捕获。我建议保持命名相同,但您可以使用 [DataMember(name="MyProperty")] 对其进行映射。此外,您的 [DataContract] 必须映射为匹配 XML 有效负载的父节点的名称,例如 [DataContract(Name="MyRequest")],但前提是类的名称与 xml 节点不同。这样做,它会将您的 xml 反序列化为服务器端对象/dto
  • 您收到的错误听起来像是在抱怨 DataContract 内部的复杂类型。您的复杂类型需要像您的 MyRequest 类型一样进行序列化修饰。
  • 还要确保您的 REST 端点绑定到 webHttpBinding
于 2012-10-01T22:20:14.383 回答