我们试图在客户端中实现由用户(在设置屏幕上)决定的可选gzip压缩,我们使用
HttpClient
,这样我们可以记录并比较一段时间内多个不同调用的性能。我们的第一次尝试是简单地有条件地添加标题,如下所示:HttpRequestMessage request = new HttpRequestMessage(Method, Uri);
if (AcceptGzipEncoding)
{
_client.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("gzip"));
}
//Send to the server
result = await _client.SendAsync(request);
//Read the content of the result response from the server
content = await result.Content.ReadAsStringAsync();
这样创建了正确的请求,但返回时未解压缩gzip响应,导致响应混乱。我发现在构建HttpClient
时必须包括HttpClientHandler
:
HttpClient _client = new HttpClient(new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.GZip
});
这一切都很顺利,但我们希望在运行时更改客户端是否发送Accept-Encoding:gzip
头信息,并且似乎没有任何方法可以访问或更改 HttpClient
构造函数之后传递给 HttpClientHandler
的值。此外,如果由 HttpClientHandler
定义,则修改 HttpRequestMessage
对象的标头对请求的标头没有任何影响。
有没有办法在不每次更改时重新创建 HttpClient
的情况下实现这一点?
编辑:我还尝试修改对 HttpClientHandler
的引用,以在运行时更改 AutomaticDecompression
,但会抛出以下异常:
此实例已启动一个或多个请求。 只能在发送第一个请求之前修改属性。