5

1 つの操作メソッドと、要求/応答のタイプのペアを定義した単純なエコー サービスがあります。

[ServiceContract(Name = "EchoService", 
                 Namespace = "http://example.com/services", 
                 SessionMode = SessionMode.NotAllowed)]
public interface IEchoService
{
    [OperationContract(IsOneWay = false,
                       Action = "http://example.com/services/EchoService/Echo", 
                       ReplyAction = "http://example.com/services/EchoService/EchoResponse")]
    EchoResponse Echo(EchoRequest value);
}

データ型:

[Serializable]
[DataContract(Namespace = "http://example.com/services/EchoService", 
              Name = "EchoRequest")]
public class EchoRequest
{
    public EchoRequest() { }

    public EchoRequest(String value)
    {
        Value = value;
    }

    [DataMember]
    public String Value { get; set; }
}

[Serializable]
[DataContract(Namespace = "http://example.com/services/EchoService", 
              Name = "EchoResponse")]
public class EchoResponse
{
    public EchoResponse() { }

    public EchoResponse(String value)
    {
        Value = value;
    }

    [DataMember]
    public String Value { get; set; }
}

EchoRequest のインスタンスで Message.CreateMessage() を呼び出すと、次のようになります。

  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header />
    <s:Body>
      <EchoRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/services/EchoService">
        <Value>hello, world!</Value>
      </EchoRequest>
    </s:Body>
  </s:Envelope>

...まさに私が欲しいものです。ただし、次のように、メッセージ本文が別の XML 要素でさらにラップされることをサービスが想定しているようです。

  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header />
    <s:Body>
      <Echo xmlns="http://example.com/services">
        <EchoRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://example.com/services/EchoService">
          <Value>hello, world!</Value>
        </EchoRequest>
      </Echo>
    </s:Body>
  </s:Envelope>

更新: マークの返信のおかげで、リクエスト/レスポンス タイプで DataContract の代わりに MessageContract を調査しました。これは私が望むものに近いようですが、今は行き過ぎており、外側の型要素「EchoRequest」を期待していません。

どういうわけか Message.CreateMessage が間違いなく正しい XML を生成するように見えるため、これは紛らわしいので、サービスが受け入れるように構成したいデフォルトのシリアライゼーションを使用しているようです。Message.CreateMessage の仕組みを誤解しているだけですか?

4

2 に答える 2

2

IIRC、WCF はデフォルトで「Wrapped」メッセージ スタイルを使用します。メッセージのシリアル化方法を制御できるようにする場合は、MessageContractAttributeで装飾することによって明示的なメッセージを定義できます。明示的なメッセージ コントラクトを使用すると、IsWrappedプロパティを に設定できますfalse

あなたの場合、EchoRequest と EchoResponse は DataContracts ではなく、MessageContracts であるべきだと思います。私には MessageContracts によく似ています。

于 2009-07-15T10:36:53.887 に答える