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>();
}
Почему не удается получить доступ к зарегистрированной службе? Я что-то делаю против шаблона?