7

現在、セルフホステッド WCF REST アプリケーション用の GZIP 圧縮を作成しています。.NET 'MessageEncoder' クラスのカスタム実装と 'WebContentTypeMapper' クラスのカスタム実装があります。

「ReadMessage」関数と「GetMessageFormatForContentType」関数で http ヘッダーを取得するにはどうすればよいですか? 入力を解凍する前に、「Content-Encoding」ヘッダーの受信リクエストを確認したいと思います。

ありがとうございました。

4

3 に答える 3

3

これはあなたができることです

if (WebOperationContext.Current.IncomingRequest.Headers["Content-Encoding"] == WHAT YOU WANT)
{
            // Do what you like to do here
}

お役に立てれば。

ありがとう。

于 2012-09-07T15:04:44.153 に答える
1

CustomMessageEncoder からヘッダーに直接アクセスできるとは思えません。できることは、更新された .NET 4.5 WCF BinaryMessageEncoderBindingElementを活用することです。これにより、圧縮タイプ (Gzip など) を指定できるようになり、解凍を試みる前にメッセージ本文が圧縮されているかどうかを自動的に検出できるようになりました。詳細については、Windows Communication Foundation 4.5 の新機能を参照してください。

ヘッダーにアクセスしたい場合は、 IDispatchMessageInspectorの実装でHttpRequestMessagePropertyを利用する方法を試すことができます。

簡単な例:

    public class MyDispatchMessageInspector : IDispatchMessageInspector
    {
        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            object obj;
            if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out obj))
            {
                 var httpRequestMessageProperty = obj as HttpRequestMessageProperty;

                 if (httpRequestMessageProperty != null 
                         && !string.IsNullOrEmpty(httpRequestMessageProperty.Headers["content-encoding"]))
                 {
                    ...
                 }
            }
            return null;
     }
     ...
}

別のオプションはOperationContext、次を使用してアクセスすることです。

int index = System.ServiceModel.OperationContext.Current.IncomingMessageHeaders.FindHeader("content-encoding", "");
string contentEncodeHeaderValue = System.ServiceModel.OperationContext.Current.IncomingMessageHeaders.GetHeader<string>(index);
于 2012-09-08T02:00:42.540 に答える
1

WebOperationContext.Current または OperationContext.Current (バインディングに応じて) を試すことができます。しかし、残念ながら、MessageEncoder がメッセージの内容を書き込むように求められるまでに、メッセージ フレーム (この場合は HTTP ヘッダー) が既に書き込まれているため、プロセスが遅すぎるため、MessageEncoder の実装自体でこれを行うことはできないと思います。そのため、それに応じてヘッダーを設定する操作に適用される、IOperationBehavior の形式の追加の動作も必要になります。私の個人的な実装の 1 つで、カスタム メッセージ インスペクタを使用して OperationContext に GzipExtension を追加することでこれを解決しました。Alex が言ったように、IIS には、構成された任意のコンテンツ タイプを圧縮できる動的圧縮と呼ばれる機能が既にあります。

于 2012-09-05T11:39:18.427 に答える