HttpContext.RequestServices.GetRequiredService <T> не может получить зарегистрированную службу

Я получаю сообщение об ошибке, когда пытаюсь получить доступ к зарегистрированной службе в методе:

При обработке запроса возникло необработанное исключение. 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 (IComponentType context.InterfaceContext.InterfaceService.Extensions.Resolve (контекст службы Autofac.ResolutionExtensions. GetRequiredService(тип serviceType) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(поставщик IServiceProvider,Введите serviceType) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(поставщик IServiceProvider)DA.BrrMs.Portal.Blazor.Startup+<> c +<b__7_7>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(OpenIdConnectMessageauthorizationResponse, OpenIdConnectMessage tokenEndpointResponse,ClaimsPrincipal пользователь, AuthenticationProperties свойства,JwtSecurityToken JWT, строка Nonce)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 httpContext) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext)

В Startupс ConfigureServices метод правильно регистрирует службу перед ошибочным блоком кода:

          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>();            
    }

Почему не удается получить доступ к зарегистрированной службе? Я что-то делаю против шаблона?

0 ответов

Другие вопросы по тегам