WCF - 无法创建抽象类

时间:2012-10-01 19:43:47

标签: c# wcf rest soap abstract

我正在编写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方法的直接参数?我已经使用了接收接口作为参数的webservices,并且使用了KnownType装饰器,它们工作得很好。同样的问题适用于抽象类,这是不行的,因为抽象类嵌套在MyRequest复杂类型的成员中?

这是我收到的错误消息:

  

来自命名空间的元素CustomerId不能将子内容反序列化为对象。请使用XmlNode []反序列化这种XML模式

1 个答案:

答案 0 :(得分: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反序列化到服务器端object / dto
  • 您收到的错误听起来像是在抱怨DataContract内部的复杂类型。您的复杂类型需要按照与MyRequest类型相同的方式进行序列化修饰。
  • 还要确保您的REST端点绑定到webHttpBinding