c# - 使用 IHttpClientFactory 为每个请求设置请求标头
问题描述
我正在使用带有IHttpClientFactory
. 像这样:
// Startup.cs
services.AddHttpClient<MyHttpClient>()
// MyHttpClient.cs
public class MyHttpClient
{
public MyHttpClient(HttpClient client)
{
Client = client;
}
public HttpClient Client { get; }
}
// MyService.cs
public class MyService {
public MyService(MyHttpClient httpClient) {}
public async Task SendRequestAsync(string uri, string accessToken) {
_httpClient.Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
await _httpClient.Client.GetAsync(uri);
}
}
我不确定这是如何工作的。请求标头是仅为此请求设置,还是为使用此实例发出的每个后续请求设置httpClient
。如何根据每个请求设置标头?
解决方案
您可以使用 anDelegatingHandler
为将发出的每个请求添加标头HttpClient
。
public class HeaderHandler: DelegatingHandler
{
public HeaderHandler()
{
}
public HeaderHandler(DelegatingHandler innerHandler): base(innerHandler)
{
}
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
request.Headers.Add("CUSTOM-HEADER","CUSTOM HEADER VALUE");
return await base.SendAsync(request, cancellationToken);
}
}
}
您使用以下方式注册处理程序:
service.AddTransient<HeaderHandler>()
.AddHttpClient<MyHttpClient>()
.AddHttpMessageHandler<HeaderHandler>();
推荐阅读
- java - 无法调用“javafx.scene.control.MenuButton.getScene()
- r - 多GPU模式不应该更快吗?以玩具为例
- javascript - Discord bot 不响应命令(Javascript)
- apache-spark - 将 spark Java 的最终数据集输出写入 s3
- composer-php - 作曲家需要“结论” - 如何阅读和修复
- ajax - 在 Ajax URL 中传递参数
- powershell - 为什么导出的文件是空白的?
- docker - 新浏览器无法在带有 Docker 的服务器上的 Robot Framework 中运行
- mysql - 我正在尝试在下订单时更新产品数量,但 sql 在尝试获取当前值时返回垃圾值
- python - 如何让discord bot适应其他服务器?