c# - 启动后如何创建命名客户端?
问题描述
对于我的应用程序,我需要为 HttpRequests 创建一个命名客户端。我可以在 Startup 中创建一个命名客户端。为了访问它,我注入一个“ IHttpClientFactory ”并从中创建一个客户端。但是客户端需要有一个访问令牌作为授权标头,我无法在 Startup 中创建令牌。因此,我需要一种在 Startup 类之外创建命名客户端的方法。我已经尝试将“ IServiceCollection ”注入控制器。但这不起作用。
或者是否有办法在启动时创建命名客户端后对其进行编辑?
解决方案
与@Ruben-J 发布的解决方案类似的解决方案是创建一个自定义 HttpMessageHandler,它为在请求时通过 HttpClient 发出的请求分配一个授权标头。
您可以创建一个自定义 HttpMessageHandler ,它可以分配给 Startup 中的命名 HttpClient ,如下所示:
public class YourHttpMessageHandler : DelegatingHandler
{
private readonly IYourTokenProviderService _yourTokenProviderService;
public YourHttpMessageHandler(IYourTokenProviderService yourTokenProviderService)
: base()
{
_yourTokenProviderService = yourTokenProviderService;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var response = SendAsyncWithAuthToken(request, cancellationToken);
if (response.StatusCode == HttpStatusCode.Unauthorized)
{
await _yourTokenProviderService.RefreshTokenAsync();
response = SendAsyncWithAuthToken(request, cancellationToken);
}
return response;
}
private async Task<HttpResponseMessage> SendWithAuthTokenAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _yourTokenProviderService.Token);
return await base.SendAsync(request, cancellationToken);
}
}
然后在 Startup 中配置服务并命名为 HttpClient:
public virtual void ConfigureServices(IServiceCollection services)
{
...
services.AddTransient<IYourTokenProviderService, YourTokenProviderService>();
services.AddTransient<YourHttpMessageHandler>();
services.AddHttpClient<IYourNamedHttpClient, YourNamedHttpClient>()
.AddHttpMessageHandler<YourHttpMessageHandler>();
...
}
值得注意的是,Polly 的当前实现AddPolicyHandler
也在添加自己的 DelegatingHandler。有关更多背景信息,请参阅有关添加 DelegatingHandler 的Microsoft文档。这里还有来自 Steve Gordon 的精彩系列文章。
推荐阅读
- typescript - 将 Union 类型转换为 Intersection 类型
- php - 使用 SSL 和 phpmyadmin 连接到 mysql
- node.js - 当我保存()实体时出现错误 - 错误:循环依赖:“e” - 具有 typeORM 的 AWS 无服务器
- javascript - 如何解决当我单击确定时它会删除数据但当我单击取消时它也会删除。单击取消时它应该什么都不做
- firebase - Firebase 的离线镜像
- c++ - 如何从 SHELLEXECUTEINFO 对象读取控制台输出?
- django - 如何使用模板标签呈现表单“属性”/字段小部件
- python - 如何处理xml文件中丢失的数据?
- php - 如何在 html 中使用带有数据列表的 foreach 循环
- hover - 列表悬停弄乱整个导航 div