使用Blazor Asp.net Core 3.1.0 Preview 3添加Jwt HttpClient处理程序

我最近将项目从Asp.Net Core 3.0升级到了最新版本Asp.Net Core 3.1.0 preview 3

我的项目在客户端中运行Blazor,我还拦截了管道,以使用扩展了JwtTokenHeaderHandler的{​​{1}}向发送回服务器的每个请求的标头添加Jwt。

我将其添加到DelegatingHandler项目的startup.cs中,如下所示:

blazor.client

但是,自升级以来, services.AddSingleton<HttpClient>(s => { // Creating the URI helper needs to wait until the JS Runtime is initialized,so defer it. var uriHelper = s.GetRequiredService<Navigationmanager>(); var myHandler = s.GetRequiredService<JwtTokenHeaderHandler>(); myHandler.InnerHandler = new WebAssemblyHttpMessageHandler(); return new HttpClient(myHandler) { BaseAddress = new Uri(uriHelper.BaseUri) }; }); 似乎不再可用?

我找不到有关如何解决此方法的任何文档。

有人可以建议我如何纠正此问题吗?

根据Aqua的答案进行更新

将以下代码添加到我的WebAssemblyHttpMessageHandler()之后;

Startup.cs

从我的 services.AddTransient(p => { var wasmHttpMessageHandlerType = Assembly.Load("WebAssembly.Net.Http") .GetType("WebAssembly.Net.Http.HttpClient.WasmHttpMessageHandler"); var constructor = wasmHttpMessageHandlerType.getconstructor(Array.Empty<Type>()); return constructor.Invoke(Array.Empty<object>()) as HttpMessageHandler; }) .AddTransient<JwtTokenHeaderHandler>(); 文件中调用Authorized获取端点;

.razor

(上面只是使用扩展方法的类型化包装服务响应);

var response = await Http.Getasync<ContactTypeOutputModel[]>("ContactTypes/all");

该服务仍显示401吗?并没有输出日志记录说正在使用该服务?

    public static async Task<ServiceResponse<T>> Getasync<T>(
        this HttpClient httpClient,string url)
    {
        var response = await httpClient.Getasync(url);

        return await BuildResponse<T>(response);
    }

有什么想法为什么没有被实现?

MztKid 回答:使用Blazor Asp.net Core 3.1.0 Preview 3添加Jwt HttpClient处理程序

WebAssemblyHttpMessageHandler已由Mono的WasmHttpMessageHandler替代,因为您无法向 WebAssembly.Net.Http 添加依赖项。 为了为Blazor WASM创建DependencyHandler,我做了一点技巧:

    public class OidcDelegationHandler : DelegatingHandler
    {
        private readonly IUserStore _userStore;
        private readonly HttpMessageHandler _innerHanler;
        private readonly MethodInfo _method;

        public OidcDelegationHandler(IUserStore userStore,HttpMessageHandler innerHanler)
        {
            _userStore = userStore ?? throw new ArgumentNullException(nameof(userStore));
            _innerHanler = innerHanler ?? throw new ArgumentNullException(nameof(innerHanler));
            var type = innerHanler.GetType();
            _method = type.GetMethod("SendAsync",BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod) ?? throw new InvalidOperationException("Cannot get SendAsync method");
            WebAssemblyHttpMessageHandlerOptions.DefaultCredentials = FetchCredentialsOption.Include;
        }
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
        {
            request.Headers.Authorization = new AuthenticationHeaderValue(_userStore.AuthenticationScheme,_userStore.AccessToken);            
            return _method.Invoke(_innerHanler,new object[] { request,cancellationToken }) as Task<HttpResponseMessage>;
        }
    }

通过以下方式在DI中进行设置:

return services
    .AddTransient(p =>
    {
        var wasmHttpMessageHandlerType =  Assembly.Load("WebAssembly.Net.Http")
            .GetType("WebAssembly.Net.Http.HttpClient.WasmHttpMessageHandler");
        var constructor = wasmHttpMessageHandlerType.GetConstructor(Array.Empty<Type>());
        return constructor.Invoke(Array.Empty<object>()) as HttpMessageHandler;
    })

完整代码为here

本文链接:https://www.f2er.com/3028896.html

大家都在问