4

WCF でメッセージ コントラクトとして使用する次の型があります。

[MessageContract(IsWrapped = true, 
                 WrapperNamespace = "http://example.com/services", 
                 WrapperName = "EchoRequest")]
public class EchoRequest
{
    public EchoRequest() { }
    public EchoRequest(String value)
    {
        Value = value;
    }

    [MessageBodyMember(Name = "Value", 
                       Namespace = "http://example.com/services", 
                       Order = 0)]
    public String Value { get; set; }
}

svcutil.exeを使用してこのタイプのプロキシを生成すると、それをホストするサービスと通信できるクライアントが得られ、要素の XML 名前空間はメッセージ コントラクト属性に従って正しくなります。

そのインスタンスで使用すると、名前空間はデフォルト ( http://schemas.datacontract.org/2004/07/.. .)Message.CreateMessage(...)に戻ります。のインスタンスを使用すると、同じことが起こります。名前空間をコンストラクターに渡そうとすると、ラッパーのみが名前空間に含まれます。DataContractSerializerDataContractSerializer

var requestMessage = new EchoRequest("hello, world!");
var serializer = new DataContractSerializer(typeof(EchoRequest), 
                                            "EchoRequest", 
                                            "http://example.com/services");
var stream = new MemoryStream();
serializer.WriteObject(stream, requestMessage);
var data = Encoding.UTF8.GetString(stream.ToArray());

ここで、「データ」は次のとおりです。

<EchoRequest xmlns="http://example.com/services"
             xmlns:a="http://schemas.datacontract.org/2004/07/TestClient"
             xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:Value>hello, world!</a:Value>
</EchoRequest>

が属性DataContractSerializerを無視しているように見えるのはなぜですか? svcutilMessageContractはどのようにこの作業を行うのですか?

4

1 に答える 1

5

これは、メッセージ コントラクトがデータ コントラクトではないためです。データ コントラクトは、異なる属性を使用してクラスをマークします。型付きメッセージ コンバーターを使用してみてください。

EchoRequest echoRequest = new EchoRequest{ value = "Hello" };

TypedMessageConverter echoMessageConverter = TypedMessageConverter.Create(
                 typeof(echoRequest),
                 "YourActionNameHere",
                 "http://example.com/services");
Message request = echoMessageConverter.ToMessage(
    echoRequest,MessageVersion.Soap11);

これで、メッセージの準備が整い、必要に応じてリクエストの本文を取り出すことができます。

于 2009-07-16T14:06:01.820 に答える