在为启用 gzip 压缩的 asp.net 网站中托管的 Hub 开发 SignalR 客户端时遇到一些问题。由于我们使用 IIS 压缩,来自 SignalR 的响应也被压缩,但是,客户端不理解响应,我们在客户端收到 Json 解析错误。
SignalR 内部用于HttpWebRequest
发出 http 请求,并且HttpWebRequest
可以配置为使用AutomaticDecompression
属性自动解压缩响应。所以,如果我能以某种方式获得HttpWebRequest
SignalR 用来发出请求的对象,我应该能够设置启用自动解压缩。
我认为我应该能够HttpWebRequest
通过提供HubConnection.Start
我的自定义实现来访问IHttpClient
,IHttpClient.GetAsync
采取prepareRequest
我认为应该让我访问的操作HttpWebRequest
,但是,在传递给之前HttpHelper.GetAsync
包装HttpWebRequest
并且不提供对 的访问。HttpWebRequestWrapper
prepareRequest
HttpWebRequestWrapper
HttpWebRequest
HttpHelper
类是内部的,所以也不能使用它,所以,我不确定如何使用 SignalR 启用自动解压缩。
我可以公开HttpWebRequest
in 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;
});
}
....
}