gpt4 book ai didi

c# - ASP.NET Core Web API - JWT 消息处理程序 - 无注册类型错误

转载 作者:行者123 更新时间:2023-12-04 08:17:55 26 4
gpt4 key购买 nike

我为我的 Web API 项目创建了一个 JWT token 处理程序。这个想法是这个 API 只是一个通往其他 API 的网关,并且一个 token 在它们之间共享。因此,当调用我的 API 并将调用转发给另一个时,我想自动转发附加到初始请求的 JWT。
我制作了一个自定义 MessageHandler ,如下所示:

public class JwtTokenHeaderHandler : DelegatingHandler
{
private readonly HttpContext httpContext;
public JwtTokenHeaderHandler(HttpContext httpContext)
{
this.httpContext = httpContext;
}
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
string savedToken = await this.httpContext.GetTokenAsync("access_token");
request.Headers.Add("bearer", savedToken);
return await base.SendAsync(request, cancellationToken);
}
}
然后我在 Startup 中将其注册为服务,如下所示:
services.AddTransient<HttpMessageHandler>(p => p.GetRequiredService<JwtTokenHeaderHandler>());

IHttpClientBuilder serviceClientBuilder = services.AddHttpClient<IService, Service>(client =>
{
client.BaseAddress = new Uri(this.Configuration.GetValue<string>("ServiceURL"));
}).AddHttpMessageHandler<JwtTokenHeaderHandler>();
应用程序一直运行直到发出请求,然后出现此异常:

An unhandled exception has occurred while executing the request.

System.InvalidOperationException: No service for type 'Application.API1.JwtTokenHeaderHandler' has been registered.at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)at Microsoft.Extensions.DependencyInjection.HttpClientBuilderExtensions.<>c__4`1.b__4_1(HttpMessageHandlerBuilder b)at Microsoft.Extensions.Http.DefaultHttpClientFactory.<>c__DisplayClass17_0.g__Configure|0(HttpMessageHandlerBuilder b)at Microsoft.Extensions.Http.LoggingHttpMessageHandlerBuilderFilter.<>c__DisplayClass3_0.b__0(HttpMessageHandlerBuilder builder)

最佳答案

一、注入(inject)HttpContext直接会引起问题。使用IHttpContextAccessor并在 Send 方法中访问上下文。

public class JwtTokenHeaderHandler : DelegatingHandler {
private readonly IHttpContextAccessor accessor;

public JwtTokenHeaderHandler(IHttpContextAccessor accessor) {
this.accessor = accessor;
}

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
string savedToken = await accessor.HttpContext.GetTokenAsync("access_token");
request.Headers.Add("bearer", savedToken);
return await base.SendAsync(request, cancellationToken);
}
}
下一个 GetRequiredService当请求的服务未在集合中注册时会引发该异常,因此请确保将处理程序注册到容器中
笔记

The handler type must be registered as a transient service.


引用 AddHttpMessageHandler<THandler>(IHttpClientBuilder)
services.AddTransient<JwtTokenHeaderHandler>();
这样 JwtTokenHeaderHandler可以根据服务提供商的要求解决
services.AddTransient<HttpMessageHandler>(p => p.GetRequiredService<JwtTokenHeaderHandler>());
services.AddHttpClient<IService, Service>(client => {
client.BaseAddress = new Uri(this.Configuration.GetValue<string>("ServiceURL"));
}).AddHttpMessageHandler<JwtTokenHeaderHandler>();

关于c# - ASP.NET Core Web API - JWT 消息处理程序 - 无注册类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65630093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com