如果我想每次更改 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
属性,您可能会抛出异常同时。
似乎 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
属性,您可能会抛出异常同时。