0

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がこれらのヘッダーをサポートしていないようであり、カスタムバインディングの実装が必要であるというものでした。より良いアプローチのために調査が続けられています。

4

1 に答える 1

1

MessageHeadersクラスには、MessageHeadersのコレクションをパラメーターとして受け取るコンストラクターがあることに気付きました。たぶん、それが機能するかどうかを確認するために必要なヘッダーの完全なコレクションを渡すことができます。私はこれまでWS-Securityヘッダーを使用したことがないため、これが実現可能かどうかはわかりません。私は、それらが独自の名前空間(wsse:http ://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd )にあることを知っています。メッセージヘッダー用に定義されています。

メッセージングの基礎の概要を説明するこの記事を見つけました。ヘッダーの作成例があります。

于 2008-09-25T20:15:50.373 に答える