问题描述
当我尝试在 Startup
的 ConfigureServices
方法中访问注册服务时遇到错误:
处理请求时发生未处理的异常。 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+
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 上下文)
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>();
}
为什么注册的服务访问失败?我在做一些违反模式的事情吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)