私は 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 のパターンを逆シリアル化してください