代码之家  ›  专栏  ›  技术社区  ›  Damn Vegetables

如果每次都要更改Referer头,不能使用GetStringAsync()?

  •  0
  • Damn Vegetables  · 技术社区  · 3 年前

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

    var html = httpClient.GetStringAsync(url);
    

    但我需要更改一些标题值,比如 Referer 每次都是。起初,我试过

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

    ,但这在第二次出现错误。似乎一旦设定,就无法改变。

    我寻找了一个解决方案,找到了一个( https://stackoverflow.com/a/12023307/455796 ),但这似乎比 GetStringAsync .我需要创建一个 HttpRequestMessage 呼叫 SendAsync ,继续通话 response.Content.ReadAsAsync 呼叫 Wait() ,然后读取结果。此外,评论说我需要处理 HttpRequestMessage .如果这是更改标题的唯一方法,我会这样做,但这是最好的方法吗?我不能用吗 GetStringAsync 更改标题值?

    0 回复  |  直到 3 年前
        1
  •  1
  •   Andy    3 年前

    你可以这样做:

    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();
        }
    }
    

    或者,如果要覆盖默认的请求头,请按以下方式执行:

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

    第一种方法是如果你想重复使用 HttpClient 在应用程序的整个生命周期中。也就是说,如果您与需要发出HTTP请求的每个对象或方法共享它。如果多个线程试图在每个线程修改头的同时使用它,那么这样做不会导致冲突。 DeafaultRequestHeaders 线程安全。。。因此,如果有多个线程正在修改 DeafaultRequestHeaders 同时也有财产。