1. ホーム
  2. wcf

[解決済み] すべてのWCF呼び出しにカスタムHTTPヘッダを追加するには?

2022-04-22 21:26:25

質問

Windows サービスでホストされている WCF サービスがあります。このサービスを使用するクライアントは、サービスメソッドを呼び出すたびに識別子を渡す必要があります(その識別子は、呼び出されたメソッドが何をすべきかに重要であるため)。私は、この識別子をWCFヘッダ情報に何らかの形で配置するのが良いアイデアだと思いました。

もしそれが良いアイデアなら、どうすればヘッダー情報に識別子を自動的に追加できるでしょうか。つまり、ユーザーがWCFメソッドを呼び出すたびに、識別子が自動的にヘッダーに追加されるようにする必要があります。

UPDATEしてください。 WCFサービスを利用するクライアントは、WindowsアプリケーションとWindows Mobileアプリケーション(Compact Frameworkを使用)の両方です。

解決方法は?

これの利点は、すべての通話に適用されることです。

を実装したクラスを作成します。 IClientMessageInspector . BeforeSendRequest メソッドで、送信メッセージにカスタム・ヘッダを追加します。 それは以下のようなものです。

public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
    HttpRequestMessageProperty httpRequestMessage;
    object httpRequestMessageObject;
    if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out httpRequestMessageObject))
    {
        httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;
        if (string.IsNullOrEmpty(httpRequestMessage.Headers[USER_AGENT_HTTP_HEADER]))
        {
            httpRequestMessage.Headers[USER_AGENT_HTTP_HEADER] = this.m_userAgent;
        }
    }
    else
    {
        httpRequestMessage = new HttpRequestMessageProperty();
        httpRequestMessage.Headers.Add(USER_AGENT_HTTP_HEADER, this.m_userAgent);
        request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage);
    }
    return null;
}

次に、メッセージインスペクタをクライアントランタイムに適用するエンドポイントビヘイビアを作成します。 ビヘイビアは、属性またはビヘイビア拡張要素を使用した設定によって適用することができます。

以下は、素晴らしい HTTP user-agent ヘッダをすべてのリクエストメッセージに追加する方法です。 私はいくつかのクライアントでこれを使用しています。 を実装することで、サービス側でも同じことができます。 IDispatchMessageInspector .

このようなイメージでしょうか?

更新しました。 こんなの見つけた リスト コンパクトフレームワークでサポートされているWCFの機能。 メッセージインスペクタは「Channel Extensibility」に分類されると思うのですが、この記事によると はコンパクトフレームワークでサポートされています。