如果我想每次更改 Referer header,就不能使用 GetStringAsync() 吗?

Can't use GetStringAsync() if I want to change the Referer header each time?

似乎 HttpClient 是进行 HTTP 通信的推荐方式。下载 HTML 的 URL 似乎很容易

var html = httpClient.GetStringAsync(url);

但我每次都需要更改一些 header 值,例如 Referer。一开始,我试过

httpClient.DefaultRequestHeaders.Add("Referer", referrer);

,但是这导致第二次出错。好像是一旦设定就不能更改了

我搜索了一个解决方案并找到了一个(),但这似乎比 GetStringAsync 复杂得多。我需要创建一个HttpRequestMessage,调用SendAsync,继续调用response.Content.ReadAsAsync,调用Wait(),然后读取结果。另外,评论说我需要处理 HttpRequestMessage。如果这是更改 headers 的唯一方法,我会这样做,但这是最好的方法吗?我不能使用 GetStringAsync 并更改 header 值吗?

你可以这样做:

using(var msg = new HttpRequestMessage(HttpMethod.Get, new Uri("https://www.test.com")))
{
    msg.Headers.Referrer = new Uri("https://www.example.com");
    using (var req = await _httpClient.SendAsync(msg))
    {
        var str1 = await req.Content.ReadAsStringAsync();
    }
}

或者,如果您想覆盖默认请求 headers,请这样做:

_httpClient.DefaultRequestHeaders.Referrer = new Uri("https://www.example.com");
var str2 = await _httpClient.GetStringAsync("https://www.test.com/");

第一种方法是,如果您想在应用程序的整个生命周期中重复使用 HttpClient。意思是,如果您与每个 object 或需要发出 HTTP 请求的方法共享它。如果每个线程正在修改 headers 时多个线程试图同时使用它,这样做不会导致冲突。 DeafaultRequestHeaders 不是 thread-safe... 所以如果有多个线程正在修改 DeafaultRequestHeaders 属性,您可能会抛出异常同时。