Веб-сервис ASP.NET Core не загружает appsettings.json в конфигурацию - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть веб-приложение ASP.NET Core 2.1 с Razor Pages, в котором информация аутентификации AAD определена в файле appsettings.json (любезно предоставлено шаблоном приложения по умолчанию - о том, как я туда попал, см. Ниже). Тем не менее, при попытке настроить аутентификацию в Startup.cs конфигурация не имеет никаких значений конфигурации из моего appsettings.json. Если я проверяю объект IConfiguration в отладчике, то он, похоже, имеет только конфигурации переменных среды:

enter image description here

Вот метод Startup.ConfigureServices, в котором проблема заключается:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
        .AddAzureAD(options =>
        {
            // This is from the default template. It should work, but the relevant settings aren't there so options isn't populated.
            this.Configuration.Bind("AzureAd", options);

            // This of course works fine
            options.Instance = "MyInstance";
            options.Domain = "MyDomain";
            options.TenantId = "MyTenantId";
            options.ClientId = "MyClientId";
            options.CallbackPath = "MyCallbackPath";
        });

    services.AddMvc(options =>
    {
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
        options.Filters.Add(new AuthorizeFilter(policy));
    })
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

И конфигурация службы в случае ее важности (обратите внимание, что она создается поверх службы без сохранения состояния фабричной структуры):

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    return new ServiceInstanceListener[]
    {
        new ServiceInstanceListener(serviceContext =>
            new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
            {
                ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");

                return new WebHostBuilder()
                            .UseKestrel(opt =>
                            {
                                int port = serviceContext.CodePackageActivationContext.GetEndpoint("ServiceEndpoint").Port;
                                opt.Listen(IPAddress.IPv6Any, port, listenOptions =>
                                {
                                    listenOptions.UseHttps(GetCertificateFromStore());
                                    listenOptions.NoDelay = true;
                                });
                            })
                            .ConfigureServices(
                                services => services
                                    .AddSingleton<StatelessServiceContext>(serviceContext))
                            .UseContentRoot(Directory.GetCurrentDirectory())
                            .UseStartup<Startup>()
                            .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
                            .UseUrls(url)
                            .Build();
            }))
    };
}

Для создания этого сервиса я использовал мастер в VS2017. Я выбрал существующий проект сервисной фабрики (.sfproj) и выбрал Services > Add > New Service Fabric Service и выбрал Stateless ASP.NET Core [for .NET Framework], затем на следующей странице я выбрал Web Application (тот, что со страницами Razor, а не MVC) и щелкнул Change Authentication, где я выбрал Work or School Accounts и ввел мою информацию AAD. Единственными изменениями, которые я сделал в этом шаблоне, было добавление кода в вызове к AddAzureAD в Startup.ConfigureServices и установка файлов appsettings.json, которые всегда будут копироваться в выходной каталог.

Почему файл appsettings.json не загружается в конфигурацию? Как я понимаю, это должно происходить по умолчанию, но что-то, похоже, отсутствует ...

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Другой подход заключается в том, чтобы вручную создать конфигурацию с помощью ConfigurationBuilder, а затем использовать метод UseConfiguration.

var configuration = new ConfigurationBuilder()
     .SetBasePath(Directory.GetCurrentDirectory())
     .AddJsonFile("appsettings.json", false, true)
     .Build();

var host = new WebHostBuilder()
     .UseConfiguration(configuration)
     .UseKestrel()
     .UseStartup<Startup>();

Основной целью является ядро, чтобы обеспечить немного гибкости при реализации, они часто дают ошибку меньше - больше. Вы должны четко сказать, что вы хотели бы, чтобы конвейер оставался относительно небольшим.

0 голосов
/ 14 ноября 2018

WebHostBuilder по умолчанию не загружается appsettings.json, вам нужно вручную позвонить AddJsonFile. Например:

return new WebHostBuilder()
            .UseKestrel(opt =>
            {
                //snip
            })
            .ConfigureAppConfiguration((builderContext, config) =>
            {
                config.AddJsonFile("appsettings.json", optional: false);
            })
            .ConfigureServices(
                services => services
                    .AddSingleton<StatelessServiceContext>(serviceContext))
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseStartup<Startup>()
            .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
            .UseUrls(url)
            .Build();

В качестве альтернативы вы можете использовать WebHost.CreateDefaultBuilder, который будет загружать больше значений по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...