gpt4 book ai didi

使用 gzip 压缩的 SignalR

转载 作者:行者123 更新时间:2023-12-02 12:12:13 26 4
gpt4 key购买 nike

为启用了 gzip 压缩的 ASP.NET 网站中托管的集线器开发 SignalR 客户端时遇到一些问题。由于我们使用 IIS 压缩,来自 SignalR 的响应也会被压缩,但是客户端无法理解响应,我们会在客户端收到 Json 解析错误。

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

我认为我应该能够通过提供 HubConnection.Start 以及我的 IHttpClient 的自定义实现来访问 HttpWebRequestIHttpClient.GetAsync 采取了 prepareRequest 操作,我认为该操作应该可以让我访问 HttpWebRequest,但是,HttpHelper.GetAsync 包装在传递给 prepareRequest 之前使用 HttpWebRequestWrapperHttpWebRequestHttpWebRequestWrapper 不提供对 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 编码和流媒体不能混合。在永久帧传输的情况下,客户端将无法解码任何流媒体内容,直到收到整个响应或至少接收到重要的数据 block (由于数据解码方式)。对于 Web 套接字,目前不支持任何类型的编码,尽管显然对每个消息编码的规范进行了扩展 being worked on .

也就是说,如果您想尝试为 LongPolling 传输提供支持,我认为实现这一点的唯一方法是提供您自己的 SignalR IHttpClient 实现。您现在可以看到 DefaultHttpClient 类使用 HttpHelper::GetAsync 它在内部创建 HttpWebRequest 并且您永远无法获得它,因为此时您只能访问 IRequest,即 HttpWebRequestWrapper

通过创建自己的 IHttpClient,您可以接管 HttpWebRequest 的初始实例化,设置 AutomaticDecompression,然后自己将其包装起来HttpWebRequestWrapper

关于使用 gzip 压缩的 SignalR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12717101/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com