代码之家  ›  专栏  ›  技术社区  ›  dafna

无法解析ASP.NET示例项目的服务(使用核心1而不是2)

  •  1
  • dafna  · 技术社区  · 6 年前

    我使用的是ASP.NET核心1而不是2,并尝试在我的系统上运行OpenIDdict的示例。我做了一些小改动,使这个项目可以为我建造。但我在调试时出错了,不知道如何处理。有人对我有什么想法/提示吗?谢谢!

    System.InvalidOperationException:无法解析类型的服务 “Microsoft.Extensions.Configuration.IConfiguration”正在尝试 激活“authorizationserver.startup”。在 Microsoft.Extensions.Internal.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider) 提供者) Microsoft.aspnetcore.hosting.Internal.Startuploader.LoadMethods(IServiceProvider 服务,类型startuptype,字符串environmentname)位于 Microsoft.aspnetcore.hosting.webhostbuilderextensions.<>c_uu displayClass1_0.b_uuuu 1(IServiceprovider AT) Microsoft.Extensions.DependencyInjection.ServiceProvider.ScopedcallSite.Invoke(ServiceProvider 提供者) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider) 提供程序,键入servicetype)at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider) 提供者) Microsoft.aspnetcore.hosting.internal.webhost.ensureRestartup()位于 Microsoft.aspnetcore.hosting.internal.webhost.EnsureplicationServices()。 在Microsoft.aspnetcore.hosting.internal.webhost.buildApplication()上

    编辑:添加程序代码

    using System;
    using System.Threading.Tasks;
    using AuthorizationServer.Models;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using OpenIddict.Abstractions;
    using OpenIddict.Core;
    using OpenIddict.EntityFrameworkCore.Models;
    using System.Net.Http;
    using Microsoft.AspNetCore.Authentication.Cookies;
    
    namespace AuthorizationServer
    {
        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc();
    
                var connection = @"...";
                services.AddDbContext<ApplicationDbContext>(options =>
                {
                    options.UseSqlServer(connection);
    
                    options.UseOpenIddict();
                });
    
                services.AddOpenIddict()
    
                    .AddCore(options =>
                    {
                        options.UseEntityFrameworkCore()
                               .UseDbContext<ApplicationDbContext>();
                    })
    
                    .AddServer(options =>
                    {
                        options.UseMvc();
    
                        options.EnableTokenEndpoint("/connect/token");
    
                        options.AllowClientCredentialsFlow();
    
                        options.DisableHttpsRequirement();
                    })
    
                    .AddValidation();
    
                services.AddSingleton(Configuration); //changed here
            }
    
            public void Configure(IApplicationBuilder app)
            {
                app.UseDeveloperExceptionPage();
    
                app.UseOAuthValidation();
                //app.UseAuthentication();
    
                app.UseMvcWithDefaultRoute();
    
                app.UseWelcomePage();
    
                InitializeAsync(app.ApplicationServices).GetAwaiter().GetResult();
            }
    
            private async Task InitializeAsync(IServiceProvider services)
            {
                using (var scope = services.GetRequiredService<IServiceScopeFactory>().CreateScope())
                {
                    var context = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
                    await context.Database.EnsureCreatedAsync();
    
                    var manager = scope.ServiceProvider.GetRequiredService<OpenIddictApplicationManager<OpenIddictApplication>>();
    
                    if (await manager.FindByClientIdAsync("console") == null)
                    {
                        var descriptor = new OpenIddictApplicationDescriptor
                        {
                            ClientId = "console",
                            ClientSecret = "388D45FA-B36B-4988-BA59-B187D329C207",
                            DisplayName = "My client application",
                            Permissions =
                            {
                                OpenIddictConstants.Permissions.Endpoints.Token,
                                OpenIddictConstants.Permissions.GrantTypes.ClientCredentials
                            }
                        };
    
                        await manager.CreateAsync(descriptor);
                    }
                }
            }
        }
    }
    

    程序CS

    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Logging;
    
    namespace AuthorizationServer
    {
        public static class Program
        {
            public static void Main(string[] args)
            {
                var configuration = new ConfigurationBuilder()
                    .AddEnvironmentVariables()
                    .AddCommandLine(args)
                    .Build();
    
                var host = new WebHostBuilder()
                    .ConfigureLogging(options => options.AddConsole())
                    .ConfigureLogging(options => options.AddDebug())
                    .UseConfiguration(configuration)
                    .UseIISIntegration()
                    .UseKestrel()
                    .UseStartup<Startup>()
                    .Build();
    
                host.Run();
            }
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Kirk Larkin    6 年前

    在ASP.NET Core 1.x中不可能注入 IConfiguration 进入你 Startup 构造函数。相反,你可以注射 IHostingEnvironment 建立你自己的 例如:

    public Startup(IHostingEnvironment env)
    {
        Configuration = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json")
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables()
            .Build();
    }
    

    您可以排除 AddJsonFile 如果你没有台词 appsettings.json 文件-我所包含的只是一个基于ASP.NET核心1.x生成的模板的示例。