C# ASP.NET核心web服务未将appsettings.json加载到配置中
我有一个ASP.NET Core 2.1 Web应用程序,其中包含Razor页面,该页面在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
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>();