HttpContext.RequestServices.GetRequiredService<T> 无法获取注册服务

问题描述

当我尝试在 StartupConfigureServices 方法中访问注册服务时遇到错误

处理请求时发生未处理的异常。 ComponentNotRegisteredException:请求的服务 'DA.BrrMs.Portal.Blazor.Services.ResourceService' 尚未 挂号的。为了避免这个异常,要么注册一个组件到 提供服务,检查服务注册使用 IsRegistered(),或使用 ResolveOptional() 方法来解析 可选依赖。 Autofac.ResolutionExtensions.ResolveService(IComponentContext 上下文, 服务服务,IEnumerable参数)

异常:处理远程登录时遇到错误。 Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler.HandleRequestAsync()

ComponentNotRegisteredException:请求的服务 'DA.BrrMs.Portal.Blazor.Services.ResourceService' 尚未 挂号的。为了避免这个异常,要么注册一个组件到 提供服务,检查服务注册使用 IsRegistered(),或使用 ResolveOptional() 方法来解析 可选依赖。 Autofac.ResolutionExtensions.ResolveService(IComponentContext 上下文, 服务服务,IEnumerable参数) Autofac.ResolutionExtensions.Resolve(IComponentContext 上下文,类型 serviceType,IEnumerable 参数) Autofac.ResolutionExtensions.Resolve(IComponentContext 上下文,类型 服务类型) Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetrequiredService(类型 服务类型) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetrequiredService(IServiceProvider 提供者,类型 serviceType) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetrequiredService(IServiceProvider 提供者) DA.BrrMs.Portal.Blazor.Startup+c+d.MoveNext() 在 Startup.cs 中

options.Events = new OpenIdConnectEvents
{
    OnTokenValidated = async ctx =>
    {
        var ssoId = ctx.Principal.FindFirstValue("preferred_username");
        var passprovider = ctx.HttpContext.RequestServices.GetrequiredService<ResourceService>();
        var staff = await passprovider.GetResourceById(ssoId);

        if (staff != null)
        {
            var claims = new List<Claim>
            { 

Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.RunTokenValidatedEventAsync(OpenIdConnectMessage 授权响应,OpenIdConnectMessage tokenEndpointResponse, ClaimsPrincipal 用户,AuthenticationProperties 属性, JwtSecurityToken jwt,字符串随机数) Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.HandleRemoteAuthenticateAsync()

异常:处理远程登录时遇到错误。 Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler.HandleRequestAsync() Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext 语境) Toolbelt.Blazor.HeadElement.Middlewares.HeadElementServerPrerenderingMiddleware.InvokeAsync(HttpContext 上下文,IHeadElementHelperStore 存储) Serilog.AspNetCore.RequestLoggingMiddleware.Invoke(HttpContext http上下文) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)

StartupConfigureServices 方法错误代码块之前正确注册服务:

    public void ConfigureServices(IServiceCollection services)
    {
        ...

        RegisterServices(services);

        services.AddAuthentication(option =>
                 ...
                .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme,options =>
                 {
                     ...

                     options.Events = new OpenIdConnectEvents
                     {
                         OnTokenValidated = async ctx =>
                         {
                             var ssoId        = ctx.Principal.FindFirstValue("preferred_username");
                             var passprovider = ctx.HttpContext.RequestServices.GetrequiredService<ResourceService>();
                             var staff        = await passprovider.GetResourceById(ssoId);

                             if (staff != null)
                             {
                                 var claims = ...

                                 var appIdentity = new ClaimsIdentity(claims);
                                 ctx.Principal?.AddIdentity(appIdentity);
                             }
                         }
                     };
                 });
    }

    private void RegisterServices(IServiceCollection services)
    {
        services.AddTransient<CommonApiMessageHandler>();
        var baseAddress = Configuration["ApiSetup:BaseAddress"];
        
        services.AddHttpClient<IResourceService,ResourceService>("DA.BrrMs.Api.Resource",client =>
        {
            client.BaseAddress = new Uri(baseAddress);
        }).AddHttpMessageHandler<CommonApiMessageHandler>();            
    }

为什么注册的服务访问失败?我在做一些违反模式的事情吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...