带gzip压缩的SignalR [英] SignalR wth gzip compression

查看:23
本文介绍了带gzip压缩的SignalR的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为启用了gzip压缩的ASP.NET网站中托管的集线器开发SignalR客户端时遇到一些问题。因为我们使用的是IIS压缩,所以来自SignalR的响应也会被压缩,但是,客户端不理解响应,我们在客户端得到Json解析错误。

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

我认为我应该能够通过为HubConnection.Start提供IHttpClient的自定义实现来访问HttpWebRequestIHttpClient.GetAsync采取了我认为应该允许我访问HttpWebRequestprepareRequest操作,但是,HttpHelper.GetAsync在传递到prepareRequestHttpWebRequestWrapper之前用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,您永远无法获得它,因为您只能访问当时为HttpWebRequestWrapperIRequest

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

这篇关于带gzip压缩的SignalR的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆