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; }

Web サービス メソッドは次のようになります。

[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] は、[DataContract(Name="MyRequest")] のような XML ペイロードの親ノードの名前と一致するようにマッピングする必要がありますが、クラスの名前が xml ノードとは異なる場合に限ります。これを行うと、xml がサーバー側 object/dto に逆シリアル化されます
  • 取得しているエラーは、DataContract 内の複合型について不平を言っているように聞こえます。複雑な型は、 MyRequest 型と同じようにシリアル化のために装飾する必要があります。
  • また、REST エンドポイントが webHttpBinding にバインドされていることを確認してください
于 2012-10-01T22:20:14.383 に答える