带gzip压缩的SignalR [英] SignalR wth gzip compression
本文介绍了带gzip压缩的SignalR的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
为启用了gzip压缩的ASP.NET网站中托管的集线器开发SignalR客户端时遇到一些问题。因为我们使用的是IIS压缩,所以来自SignalR的响应也会被压缩,但是,客户端不理解响应,我们在客户端得到Json解析错误。
SignalR内部使用HttpWebRequest
发出http请求,HttpWebRequest
可以配置为使用AutomaticDecompression
属性自动解压缩响应。因此,如果我能以某种方式获得SignalR用来发出请求的HttpWebRequest
对象,我应该能够设置启用自动解压缩。
我认为我应该能够通过为HubConnection.Start
提供IHttpClient
的自定义实现来访问HttpWebRequest
,IHttpClient.GetAsync
采取了我认为应该允许我访问HttpWebRequest
的prepareRequest
操作,但是,HttpHelper.GetAsync
在传递到prepareRequest
和HttpWebRequestWrapper
之前用HttpWebRequest
包装了HttpWebRequest
HttpHelper
类是内部类,因此不能使用它,因此,我不太确定如何使用SignalR启用自动解压缩。
我可以在HttpWebRequestWrapper
中公开HttpWebRequest
,但是,如果存在更简单的解决方案,我会更喜欢。有什么想法吗?
我使用的是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编码和流不能混合。在永久帧传输的情况下,客户端将无法解码流内容上的任何内容,直到接收到整个响应或者至少重要的挡路数据(由于数据的解码方式)。在Web套接字的情况下,目前不支持任何类型的编码,尽管每条消息编码的规范显然有一个扩展being worked on。
也就是说,如果您想尝试提供对LongPolling传输的支持,我认为唯一可能的方法是提供您自己的SignalRIHttpClient
实现。您现在可以看到DefaultHttpClient
类使用HttpHelper::GetAsync
在内部创建HttpWebRequest
,您永远无法获得它,因为您只能访问当时为HttpWebRequestWrapper
的IRequest
。
通过创建您自己的IHttpClient
,您可以接管HttpWebRequest
的初始实例化,设置AutomaticDecompression
,然后自己用HttpWebRequestWrapper
进行包装。
这篇关于带gzip压缩的SignalR的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文