gzip圧縮が有効になっているasp.netWebサイトでホストされているハブ用のSignalRクライアントの開発に問題があります。IIS圧縮を使用しているため、SignalRからの応答も圧縮されますが、クライアントは応答を理解せず、クライアント側でJson解析エラーが発生します。
SignalRは内部HttpWebRequest
でhttp要求を行うために使用し、プロパティHttpWebRequest
を使用して応答を自動的に解凍するように構成できAutomaticDecompression
ます。したがって、SignalRが要求を行うために使用するオブジェクトを何らかの方法で取得できれば、HttpWebRequest
自動解凍を有効にするように設定できるはずです。
のカスタム実装を提供HttpWebRequest
することでにアクセスできるはずだと思ったので、にアクセスできるはずだと思ったアクションを実行しますが、に渡す前にでラップし、へのアクセスを提供しません。HubConnection.Start
IHttpClient
IHttpClient.GetAsync
prepareRequest
HttpWebRequest
HttpHelper.GetAsync
HttpWebRequest
HttpWebRequestWrapper
prepareRequest
HttpWebRequestWrapper
HttpWebRequest
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;
});
}
....
}