我正在构建供内部公司使用的AspNetCore webapi应用程序,并且需要启用Windows身份验证。
因此,我正在创建一个httpsys服务器以侦听特定端点:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseHttpSys(options =>
{
options.Authentication.Schemes =
AuthenticationSchemes.NTLM | AuthenticationSchemes.Negotiate;
options.Authentication.AllowAnonymous = true;
options.UrlPrefixes.Add("http://localhost:16000");
}).UseUrls("http://localhost:16000");
所以虽然这显然可以正常工作,但我希望能够在配置文件中对其进行配置。
在项目的早期,我使用的是Kestrel,所以我将这些设置添加到了应用程序配置中:
"Kestrel": {
"EndPoints": {
"HttpsInlineCertStore": {
"Url": "https://*:16000",
"Certificate": {
"Subject": "localhost",
"Store": "My",
"Location": "LocalMachine",
"AllowInvalid": "true"
}
} ...
现在我完全理解可以通过注册表等配置HttpSYS,所以我对这些响应不感兴趣。
我的特定问题是:对于NetCoreApi Web API应用程序,是否可以在(静态)CreateWebHostBuilder方法内使用IConfiguration?
我将IConfiguration注入到启动类中,但似乎限制在框架中,以防止在CreateWebHostBuilder方法中对其进行访问。我错过了什么吗?
答案 0 :(得分:1)
对于NetCoreApi Web API应用程序,是否可以使用 (静态)CreateWebHostBuilder方法中的IConfiguration?
是的,您将可以在ConfigureServices
内部访问它,足以进行配置。 UseHttpSys
的重载实际上可以完全相同。
因此,基本上,您只需要配置HttpSysOptions
。
对于netcoreapp2.1:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseHttpSys()
.ConfigureServices((context, services) =>
{
// Option 1. Set options manually.
services.Configure<HttpSysOptions>(options =>
{
// Use context.Configuration to access your config.
var url = context.Configuration.GetSection("MySection")["Url"];
options.UrlPrefixes.Add(url);
});
// Option 2. Build options from settings.
services.Configure<HttpSysOptions>(context.Configuration.GetSection("WebSys"));
});
对于netcoreapp3.1:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.ConfigureServices((context, services) =>
{
// Option 1. Set options manually.
services.Configure<HttpSysOptions>(options =>
{
// Use context.Configuration to access your config.
var url = context.Configuration.GetSection("MySection")["Url"];
options.UrlPrefixes.Add(url);
});
// Option 2. Build options from settings.
services.Configure<HttpSysOptions>(context.Configuration.GetSection("HttpSys"));
});
webBuilder.UseHttpSys(options =>
{
// Verify that your options is correct here.
});
});
如果要使用选项2,您的appsettings.json
应该如下所示:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"HttpSys": {
"AllowSynchronousIO": false,
"RequestQueueLimit": 2,
"MaxAccepts": 3
},
"AllowedHosts": "*"
}
请注意,UrlPrefixes
中的属性HttpSysOptions
是一个相当复杂的对象,因此我不确定您是否能够从appsettings
正确地对其进行序列化。但是,您可以简单地将配置中的字段设置为urls
,如here所述。然后HttpSys
会在您的Configuration
正确的情况下将其提取。
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"urls": "http://*:5005;",
"HttpSys": {
"AllowSynchronousIO": false,
"RequestQueueLimit": 2,
"MaxAccepts": 3
},
"AllowedHosts": "*"
}