9

在为启用 gzip 压缩的 asp.net 网站中托管的 Hub 开发 SignalR 客户端时遇到一些问题。由于我们使用 IIS 压缩,来自 SignalR 的响应也被压缩,但是,客户端不理解响应,我们在客户端收到 Json 解析错误。

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

我认为我应该能够HttpWebRequest通过提供HubConnection.Start我的自定义实现来访问IHttpClientIHttpClient.GetAsync采取prepareRequest我认为应该让我访问的操作HttpWebRequest,但是,在传递给之前HttpHelper.GetAsync包装HttpWebRequest并且不提供对 的访问。HttpWebRequestWrapperprepareRequestHttpWebRequestWrapperHttpWebRequest

HttpHelper类是内部的,所以也不能使用它,所以,我不确定如何使用 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;
        });

    }
....
}
4

1 回答 1

9

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

也就是说,如果您想尝试为 LongPolling 传输提供支持,我认为这是可能的唯一方法是提供您自己的 SignalRIHttpClient实现。您现在可以看到DefaultHttpClient该类使用HttpHelper::GetAsyncwhich 在HttpWebRequest内部创建,而您永远无法掌握它,因为此时您只能访问IRequestwhich HttpWebRequestWrapper

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

于 2012-10-04T06:45:44.520 回答