在为asp.net网站托管的集线器开发SignalR客户端时遇到了一些问题,启用了gzip压缩.由于我们使用的是IIS压缩,SignalR的响应也会被压缩,但是,客户端不理解响应,我们在客户端获得了Json解析错误.
SignalR内部用于HttpWebRequest发出http请求,并且HttpWebRequest可以配置为使用AutomaticDecompression属性自动解压缩响应.因此,如果以某种方式我可以获取HttpWebRequestSignalR用来发出请求的对象,我应该能够设置启用自动解压缩.
我想我应该能够获得访问HttpWebRequest通过提供HubConnection.Start与我的自定义实现IHttpClient,IHttpClient.GetAsync需要一个prepareRequest我认为应该给我访问的动作HttpWebRequest,但是,HttpHelper.GetAsync包装了HttpWebRequest与HttpWebRequestWrapper传递之前prepareRequest并HttpWebRequestWrapper没有提供访问HttpWebRequest.
HttpHelper class是内部的,所以也不能使用它,因此,我不确定如何使用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;
});
}
....
}
Run Code Online (Sandbox Code Playgroud)
据我所知,GZip编码和流媒体不混合.在永久帧传输的情况下,客户端将不能解码流内容上的任何内容,直到接收到整个响应或至少一个重要数据块(由于数据被解码的方式).在Web套接字的情况下,此时不支持任何类型的编码,尽管显然对于正在处理的每个消息编码的规范有扩展.
也就是说,如果您想尝试为LongPolling传输提供支持,我认为可能的唯一方法是提供您自己的SignalR IHttpClient实现.你现在可以看到,DefaultHttpClient类使用HttpHelper::GetAsync它创建的HttpWebRequest内部,你永远无法得到你的手,因为你只能访问到IRequest这是HttpWebRequestWrapper在这一点上.
通过创建自己的,IHttpClient您可以接管初始实例化HttpWebRequest,设置AutomaticDecompression,然后用自己包装HttpWebRequestWrapper.
| 归档时间: |
|
| 查看次数: |
4513 次 |
| 最近记录: |