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