修改每个请求的请求标头 C# HttpClient PCL

Posted

技术标签:

【中文标题】修改每个请求的请求标头 C# HttpClient PCL【英文标题】:Modify request headers per request C# HttpClient PCL 【发布时间】:2014-06-24 15:45:00 【问题描述】:

我目前正在使用System.Net.Http.HttpClient 来提供跨平台支持。

我了解到,为每个请求实例化一个 HttpClient 对象并不是一个好习惯,您应该尽可能重用它。

现在我在为服务编写客户端库时遇到问题。一些 API 调用需要有一个特定的标头,有些不能包含这个特定的标头。

似乎我只能操纵将随每个请求发送的“DefaultRequestHeaders”。

在实际发出请求时是否有一个选项,例如"client.PostAsync()" 仅针对特定请求修改标头?

(信息:请求可以是多线程的)。

提前致谢!

【问题讨论】:

【参考方案1】:

是的,您可以创建一个新的 HttpRequestMessage,设置您需要的所有属性,然后将其传递给 SendAsync。

var request = new HttpRequestMessage() 
   RequestUri = new Uri("http://example.org"),
   Method = HttpMethod.Post,
   Content = new StringContent("Here is my content")

request.Headers.Accept.Add(...);  // Set whatever headers you need to

var response = await client.SendAsync(request);

【讨论】:

哦,我错了..我在看Get.. : @DarrelMiller 当客户端发出多个 HttpRequestMessages 时会发生什么?例如,需要在标头中传递访问令牌以访问 api,我发出请求,然后您发出请求(我们都是客户端站点的用户) - HttpClient 实例在请求之间共享,因为它是静态的.假设我的请求比您的请求花费的时间更长,这会导致问题吗? @crizzwald 不。 SendAsync 方法是线程安全的。多个线程可以各自将它们自己的 HttpRequestMessage 实例发送到同一个 HttpClient 实例。收到响应后,正确的任务将继续。 你用这个拯救了我的一天,该死的文档缺少这些信息! @FrancescoC。在我们的 WebAPI 书中有一章是关于 HttpClient 的。可以在线免费获取chimera.labs.oreilly.com/books/1234000001708/ch14.html那里可能有一些有用的信息。【参考方案2】:

使用HttpContent.Headers。只需使用所需的标头创建 HttpContent 实例并将其传递给 PostAsync 方法。

【讨论】:

这不起作用,因为标头是 request 标头,而不是内容标头。

以上是关于修改每个请求的请求标头 C# HttpClient PCL的主要内容,如果未能解决你的问题,请参考以下文章

带有自定义标头的 C# HttpClient POST 请求发送不正确的 Content-Type 标头字段

来自 Azure 函数的 C# HttpClient POST 请求,带有用于第三方 API 的授权标记,被剥离了标头和正文

无法使用 C# HttpClient 获取任何 cookie

重新使用 HttpClient 但每个请求的超时设置不同?

带有标头和正文的 HTTPClient 发布请求

如何为 HttpClient 请求设置 Content-Type 标头?