我正在编写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模式
答案 0 :(得分:0)
您是否尝试将界面装饰为RESTful方法?
[ServiceContract]
public interface IMyRequest
{
[OperationContract]
[WebInvoke(
UriTemplate = "Requests/GetID",
Method = "POST",
BodyStyle = WebMessageBodyStyle.Wrapped)]
string GetId(MyRequest myRequest);
...
此外: