【发布时间】:2012-09-24 21:20:23
【问题描述】:
在为启用 gzip 压缩的 asp.net 网站中托管的 Hub 开发 SignalR 客户端时遇到一些问题。由于我们使用 IIS 压缩,来自 SignalR 的响应也被压缩,但是,客户端不理解响应,我们在客户端收到 Json 解析错误。
SignalR 内部使用HttpWebRequest 发出http 请求,HttpWebRequest 可以配置为使用AutomaticDecompression 属性自动解压缩响应。所以,如果我能以某种方式获得 SignalR 用来发出请求的HttpWebRequest 对象,我应该能够设置启用自动解压。
我认为我应该能够通过向HubConnection.Start 提供IHttpClient 的自定义实现来访问HttpWebRequest,IHttpClient.GetAsync 采取prepareRequest 操作,我认为这应该可以让我访问@ 987654330@,但是,HttpHelper.GetAsync 在传递给prepareRequest 之前将HttpWebRequest 与HttpWebRequestWrapper 包装在一起,而HttpWebRequestWrapper 不提供对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 压缩的服务器,发现 SignalR.Client 默认不发送 Accept-Encoding: gzip,所以我的服务器响应一个未压缩的消息并且一切都按预期工作。似乎您的客户端错误地发送了 Accept-Encoding 标头,或者您的服务器强制对 gzip 的每个响应(内置 IIS 压缩不会)。你能和 Fiddler 一起看看发生了什么事吗?
标签: signalr