AspNetCore Httpsys从webapi Appsettings文件配置useURLS

时间:2018-07-06 10:23:47

标签: asp.net-core-2.0

我正在构建供内部公司使用的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方法中对其进行访问。我错过了什么吗?

1 个答案:

答案 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": "*"
 }