SignalR与gzip压缩

Fai*_*oor 7 signalr

在为asp.net网站托管的集线器开发SignalR客户端时遇到了一些问题,启用了gzip压缩.由于我们使用的是IIS压缩,SignalR的响应也会被压缩,但是,客户端不理解响应,我们在客户端获得了Json解析错误.

SignalR内部用于HttpWebRequest发出http请求,并且HttpWebRequest可以配置为使用AutomaticDecompression属性自动解压缩响应.因此,如果以某种方式我可以获取HttpWebRequestSignalR用来发出请求的对象,我应该能够设置启用自动解压缩.

我想我应该能够获得访问HttpWebRequest通过提供HubConnection.Start与我的自定义实现IHttpClient,IHttpClient.GetAsync需要一个prepareRequest我认为应该给我访问的动作HttpWebRequest,但是,HttpHelper.GetAsync包装了HttpWebRequestHttpWebRequestWrapper传递之前prepareRequestHttpWebRequestWrapper没有提供访问HttpWebRequest.

HttpHelper class是内部的,所以也不能使用它,因此,我不确定如何使用SignalR启用自动解压缩.

我可以公开HttpWebRequestin 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;
        });

    }
....
}
Run Code Online (Sandbox Code Playgroud)

Dre*_*rsh 9

据我所知,GZip编码和流媒体不混合.在永久帧传输的情况下,客户端将不能解码流内容上的任何内容,直到接收到整个响应或至少一个重要数据块(由于数据被解码的方式).在Web套接字的情况下,此时不支持任何类型的编码,尽管显然对于正在处理的每个消息编码的规范有扩展.

也就是说,如果您想尝试为LongPolling传输提供支持,我认为可能的唯一方法是提供您自己的SignalR IHttpClient实现.你现在可以看到,DefaultHttpClient类使用HttpHelper::GetAsync它创建的HttpWebRequest内部,你永远无法得到你的手,因为你只能访问到IRequest这是HttpWebRequestWrapper在这一点上.

通过创建自己的,IHttpClient您可以接管初始实例化HttpWebRequest,设置AutomaticDecompression,然后用自己包装HttpWebRequestWrapper.

  • 但它应该与 longPolling 传输一起使用,因为在向客户端返回消息时,长时间运行的请求已完成,还是我遗漏了什么? (2认同)