ASMX Web サービスでカスタム認証ヘッダーを追加できるように、basicHttpBinding で WCF 受信/送信メッセージにカスタム SOAP ヘッダーを追加できますか? これらのカスタム SOAP ヘッダーは、.net 2.0/1.1 Web サービス クライアント (WSDL.EXE ツールでアクセス可能) を使用してアクセスできる必要があります。
2 に答える
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 クライアントから送信されたカスタム ヘッダーをスニッフィングして抽出することもできます。