Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心web服务未将appsettings.json加载到配置中_C#_Asp.net_Asp.net Core - Fatal编程技术网

C# ASP.NET核心web服务未将appsettings.json加载到配置中

C# ASP.NET核心web服务未将appsettings.json加载到配置中,c#,asp.net,asp.net-core,C#,Asp.net,Asp.net Core,我有一个ASP.NET Core 2.1 Web应用程序,其中包含Razor页面,该页面在appsettings.json文件中定义了AAD身份验证信息(由默认应用程序模板提供-请参阅下文了解我是如何做到这一点的)。但是,当尝试在Startup.cs中配置身份验证时,配置中没有我的appsettings.json中的任何配置值。如果我在调试器中检查IConfiguration对象,则它似乎只有环境变量配置: 以下是问题所在的Startup.ConfigureServices方法: public

我有一个ASP.NET Core 2.1 Web应用程序,其中包含Razor页面,该页面在
appsettings.json
文件中定义了AAD身份验证信息(由默认应用程序模板提供-请参阅下文了解我是如何做到这一点的)。但是,当尝试在
Startup.cs
中配置身份验证时,配置中没有我的
appsettings.json
中的任何配置值。如果我在调试器中检查
IConfiguration
对象,则它似乎只有环境变量配置:

以下是问题所在的
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);
}
public void配置服务(IServiceCollection服务)
{
配置(选项=>
{
//此lambda确定给定请求是否需要非必要cookie的用户同意。
options.checkApprovered=context=>true;
options.MinimumSameSitePolicy=SameSiteMode.None;
});
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(选项=>
{
//这是来自默认模板。它应该可以工作,但相关设置不存在,因此不填充选项。
this.Configuration.Bind(“AzureAd”,选项);
//这当然行得通
options.Instance=“MyInstance”;
options.Domain=“MyDomain”;
options.TenantId=“MyTenantId”;
options.ClientId=“MyClientId”;
options.CallbackPath=“MyCallbackPath”;
});
services.AddMvc(选项=>
{
var policy=new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()文件
.Build();
options.Filters.Add(新的授权过滤器(策略));
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
以及服务配置(请注意,这是在服务结构无状态服务之上构建的):

受保护的重写IEnumerable CreateServiceInstanceListeners()
{
返回新服务InstanceListener[]
{
新ServiceInstanceListener(serviceContext=>
新KestreCommunicationListener(serviceContext,“ServiceEndpoint”,(url,listener)=>
{
ServiceEventSource.Current.ServiceMessage(serviceContext,$“在{url}上启动Kestrel”);
返回新的WebHostBuilder()
.UseKestrel(选项=>
{
int port=serviceContext.CodePackageActivationContext.GetEndpoint(“ServiceEndpoint”).port;
opt.Listen(IPAddress.IPv6Any,port,listenOptions=>
{
UseHttps(GetCertificateFromStore());
listenOptions.NoDelay=true;
});
})
.配置服务(
服务=>服务
.AddSingleton(serviceContext))
.UseContentRoot(目录.GetCurrentDirectory())
.UseStartup()
.UseServiceFabricIntegration(侦听器,ServiceFabricIntegrationOptions.None)
.useURL(url)
.Build();
}))
};
}
为了创建此服务,我使用了VS2017中的向导。我选择了一个现有的service fabric项目(
.sfproj
),选择了
服务>添加>新的service fabric服务
,选择了
无状态ASP.NET核心[for.NET Framework]
,然后在下一页我选择了
Web应用程序
(带有Razor页面的,而不是MVC)然后单击
更改身份验证
,我选择了
工作或学校帐户
,并输入了我的AAD信息。我对此模板所做的唯一更改是在
Startup.ConfigureServices
中的
AddAzureAD
调用中添加代码,并将
appsettings.json
文件设置为始终复制到输出目录


为什么不将
appsettings.json
文件加载到配置中?
据我所知,这应该是默认情况下发生的,但似乎缺少了一些东西…

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();
返回新的WebHostBuilder()
.UseKestrel(选项=>
{
//剪断
})
.ConfigureAppConfiguration((builderContext,config)=>
{
config.AddJsonFile(“appsettings.json”,可选:false);
})
.配置服务(
服务=>服务
.AddSingleton(serviceContext))
.UseContentRoot(目录.GetCurrentDirectory())
.UseStartup()
.UseServiceFabricIntegration(侦听器,ServiceFabricIntegrationOptions.None)
.useURL(url)
.Build();

或者,您可以使用将加载更多默认值的方法。

另一种方法是通过
ConfigurationBuilder
手动创建配置,然后使用
UseConfiguration
方法

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

var host = new WebHostBuilder()
     .UseConfiguration(configuration)
     .UseKestrel()
     .UseStartup<Startup>();
var configuration=new ConfigurationBuilder()
.SetBasePath(目录.GetCurrentDirectory())
.AddJsonFile(“appsettings.json”,false,true)
.Build();
var host=new WebHostBuilder()
.UseConfiguration(配置)
.UseKestrel()
.UseStartup();
其主要目的是在实现时提供一点灵活性,它们通常错误少即多。你必须明确说出你想要什么,这样管道就相对较小。
var configuration = new ConfigurationBuilder()
     .SetBasePath(Directory.GetCurrentDirectory())
     .AddJsonFile("appsettings.json", false, true)
     .Build();

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