30

ASMX Web サービスでカスタム認証ヘッダーを追加できるように、basicHttpBinding で WCF 受信/送信メッセージにカスタム SOAP ヘッダーを追加できますか? これらのカスタム SOAP ヘッダーは、.net 2.0/1.1 Web サービス クライアント (WSDL.EXE ツールでアクセス可能) を使用してアクセスできる必要があります。

4

2 に答える 2

28

CodeplexのWCF Extrasを確認してください。これは、特にカスタム SOAP ヘッダーを提供する WCF 用の簡単な拡張ライブラリです。

もう 1 つのオプションは、WCF サービスでWCF メッセージ コントラクトを使用することです。これにより、WCF SOAP ヘッダーを簡単に定義および設定することもできます。

[MessageContract]
public class BankingTransaction
{
  [MessageHeader]
  public Operation operation;
  [MessageHeader] 
  public DateTime transactionDate;

  [MessageBodyMember] 
  private Account sourceAccount;
  [MessageBodyMember] 
  private Account targetAccount;
  [MessageBodyMember] 
  public int amount;
}

ここで、"operation" と "transactionDate" は SOAP ヘッダーとして定義されています。

これらの方法のいずれも役に立たない場合は、拡張機能として記述できる WCF メッセージ インスペクターの概念を確認する必要があります。これらを使用すると、たとえば、クライアントで発信するたびに特定のヘッダーをメッセージに挿入し、サーバー上のメッセージからヘッダーを取得して使用できます。

メッセージ インスペクターを作成する方法と、それをプロジェクト セットアップに含める方法の開始点については、このブログ記事「WCF 動作によるカスタム SOAP ヘッダーの処理」を参照してください。

クライアント側IClientMessageInspectorは と の 2 つのメソッドBeforeSendRequestを定義しますがAfterReceiveReply、サーバー側IDispatchMessageInspectorには反対のメソッド、つまりAfterReceiveRequestとがありBeforeSendReplyます。

これにより、ネットワークを通過するすべてのメッセージにヘッダーを追加できます (または選択的にいくつかのメッセージにのみ追加できます)。

IClientMessageInspectorこれは、クライアントからサーバーにロケール情報 (言語とカルチャ情報) を自動的に送信するために使用する実装者からのスニペットです。開始方法がわかるはずです。

public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
    International intlHeader = new International();
    intlHeader.Locale = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;

    MessageHeader header = MessageHeader.CreateHeader(WSI18N.ElementNames.International, WSI18N.NamespaceURI, intlHeader);
    request.Headers.Add(header);

    return null;
}

サーバー側では、これらのヘッダーの存在を確認し、存在する場合は SOAP エンベロープから抽出して使用します。

更新:クライアントは .NET 2.0 を使用しており、WCF を使用していません。これは問題なく動作するはずです。詳細については、このブログ記事のカスタム SOAP ヘッダー: WCF と ASMXを参照してください。サーバー側でメッセージ インスペクタを使用して、.NET 2.0 クライアントから送信されたカスタム ヘッダーをスニッフィングして抽出することもできます。

于 2009-12-29T21:15:26.977 に答える