SerializeReplyメソッドでカスタムメッセージサブクラスを構築するカスタムMessageFormatterを持つWCFWebサービスを継承しました。
class OurMessageFormatter : MessageFormatter
{
public Message SerializeReply(MessageVersion messageVersion, object[] parameters, object result)
{
OurResponse ourResponse = (OurResponse) result;
// some validation here...
OurMessage reply = new OurMessage(ourResponse, MessageVersion.Soap11);
return reply;
}
}
私たちが直面している問題は、カスタムメッセージサブクラスにヘッダーが設定されていないことです。WCFが一般的なもの(MessageID、ResponseTo、Actionなど)をすぐに使用できるかどうかを確認しようとしましたが、うまくいきませんでした。次に、カスタムメッセージサブクラスがHeadersプロパティを次のように実装していることに気付きました...
class OurMessage : Message
{
public override MessageHeaders Headers
{
get { return new MessageHeaders(MessageVersion.Soap11WSAddressing10); }
}
}
...ロッタヘルプが判明しました!だから私たちはそれをそのように書き直しました...
class OurMessage : Message
{
MessageHeaders headers;
public OurMessage()
{
// ...
headers = new MessageHeaders(MessageVersion.Soap11WSAddressing10);
}
public override MessageHeaders Headers
{
get { return headers; }
}
}
...そしてまだ運がない。
そこで、ヘッダーを手作業でコーディングしました。フォーマッターの最初...
class OurMessageFormatter : MessageFormatter
{
public Message SerializeReply(MessageVersion messageVersion, object[] parameters, object result)
{
//...
OurMessage reply = new OurMessage(ourResponse, MessageVersion.Soap11);
ourMessage.MessageID = ...;
ourMessage.ResponseTo = ...;
ourMessage.Action = ...;
// more headers set ...
return reply;
}
}
...そしてメッセージ自体に...
class OurMessage : Message
{
public override MessageHeaders Headers
{
get
{
MessageHeaders headers = new MessageHeaders(MessageVersion.Soap11WSAddressing10);
ourMessage.MessageID = ...;
ourMessage.ResponseTo = ...;
ourMessage.Action = ...;
// more headers set ...
return headers;
}
}
}
試行するたびに、WS-Addressingヘッダーを実際の応答に取り込むことができましたが、WS-Securityヘッダーを取り込むことはできませんでした(実際には、TimestampID要素とCreated / Expires要素を含むセキュリティヘッダーを入れようとしていました)。セキュリティヘッダーにセキュリティヘッダーを追加するたびに、サービスはシリアル化中に予期せず接続を切断しました(SerializeReply呼び出しが完了した後)。
これが私の質問です。カスタムフォーマッタとカスタムメッセージの実装を使用してWS-SecurityヘッダーをWCFサービスに取り込む方法を知っている人はいますか?
更新[2008年11月26日]:これに関する未解決のMSインシデントがあり、それらから取得した最新の更新は、WCFの現在のMessageVersionがこれらのヘッダーをサポートしていないようであり、カスタムバインディングの実装が必要であるというものでした。より良いアプローチのために調査が続けられています。