9

gzip圧縮が有効になっているasp.netWebサイトでホストされているハブ用のSignalRクライアントの開発に問題があります。IIS圧縮を使用しているため、SignalRからの応答も圧縮されますが、クライアントは応答を理解せず、クライアント側でJson解析エラーが発生します。

SignalRは内部HttpWebRequestでhttp要求を行うために使用し、プロパティHttpWebRequestを使用して応答を自動的に解凍するように構成できAutomaticDecompressionます。したがって、SignalRが要求を行うために使用するオブジェクトを何らかの方法で取得できれば、HttpWebRequest自動解凍を有効にするように設定できるはずです。

のカスタム実装を提供HttpWebRequestすることでにアクセスできるはずだと思ったので、にアクセスできるはずだと思ったアクションを実行しますが、に渡す前にでラップし、へのアクセスを提供しません。HubConnection.StartIHttpClientIHttpClient.GetAsyncprepareRequestHttpWebRequestHttpHelper.GetAsyncHttpWebRequestHttpWebRequestWrapperprepareRequestHttpWebRequestWrapperHttpWebRequest

HttpHelperクラスは内部であるため、それも使用できません。そのため、SignalRで自動解凍を有効にする方法が正確にはわかりません。

HttpWebRequestを公​​開することはできますHttpWebRequestWrapperが、存在する場合はより単純なソリューションをお勧めします。何か考えはありますか?

SignalRバージョン0.5.1.10822を使用しています

私の自動解凍HttpClient:

public class HttpClientWithAutoDecompression : IHttpClient
{
    readonly DefaultHttpClient _httpClient = new DefaultHttpClient();

    private readonly DecompressionMethods _decompressionMethods;
    public HttpClientWithAutoDecompression(DecompressionMethods decompressionMethods)
    {
        _decompressionMethods = decompressionMethods;
    }

    public Task<IResponse> GetAsync(string url, Action<IRequest> prepareRequest)
    {
        Task<IResponse> task = _httpClient.GetAsync(url, 
            request =>
                {
                    [ERROR: request is actually HttpRequestWrapper and
                     does not expose HttpWebRequest]**              ] 
                    var httpWebRequest = (HttpWebRequest) request; 
                    httpWebRequest.AutomaticDecompression = _decompressionMethods;
                    prepareRequest(request);
                });

        return task.ContinueWith(response =>
        {
            Log.Debug(this, "Response: {0}", response.Result.ReadAsString());
            return response.Result;
        });

    }
....
}
4

1 に答える 1

9

私の知る限り、GZipエンコーディングとストリーミングは混在していません。永久フレームトランスポートの場合、クライアントは、応答全体、または少なくともデータの重要なブロックが受信されるまで(データのデコード方法が原因で)、ストリーミングコンテンツのいずれもデコードできません。Webソケットの場合、現時点ではいかなる種類のエンコーディングもサポートされていませんが、作業中のメッセージごとのエンコーディングの仕様が拡張されているようです。

とはいえ、LongPollingトランスポートのサポートを提供しようとする場合、これが可能であることがわかる唯一の方法は、独自のSignalRIHttpClient実装を提供することです。DefaultHttpClient現在、クラスが内部HttpHelper::GetAsyncで作成するを使用していることがわかります。その時点でアクセスできるのはHttpWebRequestにしかアクセスできないため、これを手に入れることはできません。IRequestHttpWebRequestWrapper

独自のインスタンスを作成するIHttpClientことで、の最初のインスタンス化を引き継ぎ、HttpWebRequestを設定してAutomaticDecompressionから、それをでラップすることができますHttpWebRequestWrapper

于 2012-10-04T06:45:44.520 に答える