在启用了gzip压缩功能的asp.net网站中托管的Hub的开发SignalR客户端时遇到了一些问题。由于我们使用IIS压缩,SignalR的响应也会被压缩,但客户端并不理解响应,并且客户端会收到Json解析错误。SignalR wth gzip压缩
SignalR内部使用HttpWebRequest
来使make http请求和HttpWebRequest
可以配置为使用AutomaticDecompression
属性自动解压缩响应。所以,如果能以某种方式获得SignalR使用的HttpWebRequest
对象发出请求,我应该能够设置启用自动解压缩。
,我想我应该能够通过提供HubConnection.Start
我的IHttpClient
自定义实现来获得访问HttpWebRequest
,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;
});
}
....
}
现在我已经检查了也启用了gzip压缩,并发现SignalR.Client不发送的Accept-Encoding的服务器上:在默认情况下的gzip,所以我的服务器未压缩的消息作出响应,一切都按预期工作。看起来你的客户端错误地发送了Accept-Encoding头文件,或者你的服务器强制每一个对gzip的响应(内置IIS压缩都没有)。你可以检查小提琴手是怎么回事? –