【问题标题】:Error: "System.InvalidOperationException: Unable to find the required services. " How to fix?错误:“System.InvalidOperationException:无法找到所需的服务。”如何解决?
【发布时间】:2020-10-20 09:53:34
【问题描述】:

当我尝试运行我的 ASP.NET Core 应用程序时抛出了这个异常:

System.InvalidOperationException:找不到所需的服务。请通过在应用程序启动代码中对“ConfigureServices(...)”的调用中调用“IServiceCollection.AddAuthorization”来添加所有必需的服务。

在 Microsoft.AspNetCore.Builder.AuthorizationAppBuilderExtensions.VerifyServicesRegistered(IApplicationBuilder 应用程序)
在 Microsoft.AspNetCore.Builder.AuthorizationAppBuilderExtensions.UseAuthorization(IApplicationBuilder 应用程序) 在 /Users/fathindosunmu/OneDrive/MyProjects/GitHubProjects/Reactivities/Reactivities/WebAPI/Startup.cs:line 164 中的 API.Startup.Configure(IApplicationBuilder 应用程序,IWebHostEnvironment env) 在 System.RuntimeMethodHandle.InvokeMethod(对象目标,对象 [] 参数,签名 sig,布尔构造函数,布尔 wrapExceptions) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化) 在 Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(对象实例,IApplicationBuilder 构建器) 在 Microsoft.AspNetCore.Hosting.ConfigureBuilder.c__DisplayClass4_0.b__0(IApplicationBuilder 生成器) 在 Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.c__DisplayClass13_0.b__2(IApplicationBuilder 应用程序) 在 Microsoft.AspNetCore.HostFilteringStartupFilter.c__DisplayClass0_0.b__0(IApplicationBuilder 应用程序) 在 Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancelToken) 未处理的异常。 System.InvalidOperationException:找不到所需的服务。请通过在应用程序启动代码中对“ConfigureServices(...)”的调用中调用“IServiceCollection.AddAuthorization”来添加所有必需的服务。 在 Microsoft.AspNetCore.Builder.AuthorizationAppBuilderExtensions.VerifyServicesRegistered(IApplicationBuilder 应用程序) 在 Microsoft.AspNetCore.Builder.AuthorizationAppBuilderExtensions.UseAuthorization(IApplicationBuilder 应用程序) 在 /Users/fathindosunmu/OneDrive/MyProjects/GitHubProjects/Reactivities/Reactivities/WebAPI/Startup.cs:line 164 中的 API.Startup.Configure(IApplicationBuilder 应用程序,IWebHostEnvironment env) 在 System.RuntimeMethodHandle.InvokeMethod(对象目标,对象 [] 参数,签名 sig,布尔构造函数,布尔 wrapExceptions) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object[] 参数,CultureInfo 文化) 在 Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(对象实例,IApplicationBuilder 构建器) 在 Microsoft.AspNetCore.Hosting.ConfigureBuilder.c__DisplayClass4_0.b__0(IApplicationBuilder 生成器) 在 Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.c__DisplayClass13_0.b__2(IApplicationBuilder 应用程序) 在 Microsoft.AspNetCore.HostFilteringStartupFilter.c__DisplayClass0_0.b__0(IApplicationBuilder 应用程序) 在 Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancelToken) 在 Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancelToken) 在 Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost 主机,CancellationToken 令牌) 在 Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost 主机,CancellationToken 令牌) 在 Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost 主机) 在 API.Program.Main(String[] args) 在 /Users/fathindosunmu/OneDrive/MyProjects/GitHubProjects/Reactivities/Reactivities/WebAPI/Program.cs:line 16

即使我已经在configureServices 方法中注册了所有必需的服务(参见下面的注册)。如果显式调用AddAuthorization,为什么会抛出这个异常?

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<AppDbContext>(options =>
    {
        options.UseLazyLoadingProxies();
        options.UseSqlServer(
            Configuration.GetConnectionString("MsSqlConnection"));
    });

    services.AddCors(options =>
    {
        options.AddPolicy("CorsAllowAll",
            builder =>
            {
                builder.WithOrigins("http://localhost:3000");
                builder.WithExposedHeaders("WWW-Authenticate");
                builder.AllowAnyHeader();
                builder.AllowAnyMethod();
                builder.AllowCredentials();
            });
    });

    services.AddMediatR(typeof(List.Handler).Assembly);
    services.AddAutoMapper(typeof(List.Handler));
    services.AddSignalR();

    var builder = services.AddIdentityCore<AppUser>();
    var identityBuilder = new IdentityBuilder(builder.UserType, builder.Services);
    identityBuilder.AddEntityFrameworkStores<AppDbContext>();
    identityBuilder.AddSignInManager<SignInManager<AppUser>>();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("IsActivityHost", policy =>
        {
            policy.Requirements.Add(new IsHostRequirement());
        });
    });
    services.AddTransient<IAuthorizationHandler, IsHostRequirementHandler>();


    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT:SigningKey"]));
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).
        AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = key,
                ValidateAudience = false,
                ValidateIssuer = false,
                ValidateLifetime = true,
                ClockSkew = TimeSpan.Zero
            };
            options.Events = new JwtBearerEvents
            {
                OnMessageReceived = context =>
                {
                    //receiving jwt token as a request header from client because the chatHub is not a HTTP request
                    //Protocol
                    var accessToken = context.Request.Query["access_token"];
                    var path = context.HttpContext.Request.Path;
                    if (!string.IsNullOrEmpty(accessToken) && (path.StartsWithSegments("/chat")))
                    {
                        context.Token = accessToken;
                    }
                    return Task.CompletedTask;
                }
            };
        });

    services.AddControllers(options =>
    {
        var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
        options.Filters.Add(new AuthorizeFilter(policy));

    }).AddFluentValidation(config =>
        config.RegisterValidatorsFromAssemblyContaining<Create>());

    services.AddScoped<IJWTGenerator, JWTGenerator>();
    services.AddScoped<IUserAccessor, UserAccessor>();
    services.AddScoped<IPhotoAccessor, PhotoAccessor>();
    services.AddScoped<IProfileReader, ProfileReader>();
    services.Configure<CloudinarySettings>(Configuration.GetSection("Cloudinary"));
}

我到处寻找可能是什么问题的提示,但找不到解决方案。

【问题讨论】:

  • 您是否尝试过在没有授权的情况下在本地运行您的应用程序?
  • 我仍然会抛出讨厌的异常@PeterCsala
  • 在这种情况下,它仍然指的是AddAuthorization吗?
  • 请编辑您的问题并使用您正在使用的相关版本的 ASP.NET Core 添加标签。

标签: c# asp.net-web-api asp.net-core-3.1


【解决方案1】:

您可能忘记在您的Startup.Configure(IApplicationBuilder app) 方法中调用app.UseAuthorization()From the source code:

// Verify that AddAuthorizationPolicy was called before calling UseAuthorization
// We use the AuthorizationPolicyMarkerService to ensure all the services were added.
if (app.ApplicationServices.GetService(typeof(AuthorizationPolicyMarkerService)) == null)
{
    throw new InvalidOperationException(Resources.FormatException_UnableToFindServices(
        nameof(IServiceCollection),
        nameof(PolicyServiceCollectionExtensions.AddAuthorization),
        "ConfigureServices(...)"));
}

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 2019-07-22
    • 2020-05-07
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多