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 の仕組みを誤解しているだけですか?