2

次のインターフェイスを定義しました

[ServiceContract]
public interface IHealthProducts
{
    [OperationContract()]
    ResponseClass OrderSelfSignedHealthCertificate();
}

次のタイプを返します

[MessageContract]
public class ResponseClass
{
    [MessageBodyMember]
    public string AnimalSpeciesCode
    {
        get;
        set;
    }

    [MessageBodyMember]
    public int VBN
    {
        get;
        set;
    }
}

私は、生成されたクライアント コードが OrderSelfSignedHealthCertificate メソッドを次のように公開することを期待していました。

HealthProductsClient client = new HealthProductsClient();
ResponseClass response = client.OrderSelfSignedHealthCertificate();

代わりに、ResponseClass のプロパティはResponseClassにラップされませんが、次のように公開されます。

string OrderSelfSignedHealthCertificate(out int VBN)

MessageContract を DataContract 属性に交換し、MessageBodyMember を DataMember 属性に交換すると、期待される動作 (ResponseClass 応答タイプ) が得られます。ただし、SOAP ヘッダーにいくつかのプロパティを配置する必要があるため、MessageContract が必要です。

私は何か間違ったことをしていますか?これは正常な動作ですか?MessageContract を使用する場合、 ResponseClassの戻り値の型を取得するにはどうすればよいですか?

どんな助けでも大歓迎です。

4

2 に答える 2

1

[MessageContract]に複数のが含まれている場合[MessageBodyMember]、WCFは最初の値をサービス呼び出しからの戻り値として返し(AnimalSpeciesCodeあなたの場合)、他のすべてはoutまたはrefパラメータとして返されます。

これを解決する[MessageBodyMember]には、メッセージコントラクトに、返品が必要なすべてのアイテムをカプセル化する1つだけを含めると、次のようになります。

[DataContract]
class CompoundData
{
    public string AnimalSpeciesCode { get; set; }
    public int VBN { get; set; }
}

[MessageContract]
public class ResponseClass
{
    [MessageBodyMember]
    public CompoundData Payload { get; set; }
}

この場合、はCompoundDataサービス呼び出しからの戻り値である必要があります-必要な両方の要素が含まれています。

于 2010-03-03T18:03:55.510 に答える
1

マーク、ありがとう。戻り値の型をカプセル化するために、一般的な ResponseWrapper クラスを作成しました。

[MessageContract(WrapperNamespace = "http://mynamespace.com")]
public class ResponseWrapper<T>
{
    [MessageBodyMember(Namespace = "http://mynamespace.com")]
    public T Response
    {
        get;
        set;
    }
}

OrderSelfSignedHealthCertificate の returntype を次のように定義しました。

ResponseWrapper<ResponseClass> OrderSelfSignedHealthCertificate();

私のクライアントコードでは、これは次のように変換されます

ResponseClass OrderSelfSignedHealthCertificate(); 

それが私が欲しかったものです。ありがとう!

于 2010-03-05T08:25:13.623 に答える