ASP.NET Core 2无法从appsettings

时间:2017-08-31 13:29:44

标签: kestrel-http-server asp.net-core-2.0

我尝试使用ASP.NET Core 2.0通过appsettings.json中的设置配置Kestrel端点的新方法。这在Microsoft Build 2017活动中得到了证明(见YouTube时间框架21:00-26:20)。

发言者说(并证明)以下内容将配置Kestrel上的侦听端口:

{
   "Message": "TEST!!",
   "Kestrel": {
      "Endpoints": {
         "Localhost": {
            "Address": "127.0.0.1",
            "Port": "5011"
         }
      }
   }
}

但这对我没有用。当我使用' dotnet run'时,仍然使用默认端口5000。我知道正在加载appsettings.json文件,因为我可以在别处使用Message值。

GitHub上的代码中,我看不到任何正在配置Kestrel的地方。

是否有其他人能够使用此方法?我无法理解它在演示中的工作原理,但不能理解我自己的代码。

2 个答案:

答案 0 :(得分:1)

我知道这个问题是前一段时间提出的,但是我认为将其发布在上面是很有意义的,因为自最初提出此问题以来,ASP.NET Core框架已得到增强,可以从应用程序设置中支持Kestrel端点配置。 请在下面找到更多详细信息,以及有关如何在ASP.NET Core 2.1和更早版本中实现该功能的简要概述。

documentation中所述,可以从ASP.NET Core 2.1版开始在应用程序设置中配置Kestrel端点。

有关更多详细信息,可以检入实际的WebHost.CreateDefaultBuilder()实现: 从版本2.1开始,它将加载Kestrel配置部分,而在ASP.NET Core早期版本中,在设置UseKestrel()时必须显式调用WebHost

ASP.NET Core 2.1设置

在ASP.NET Core 2.1上,您可以通过简单地提供以下http://127.0.0.1:5011来设置Kestrel以监听appsettings.json

{
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://127.0.0.1:5011" 
      }
    }
  }
}

请注意,您将需要使用Url而不是AddressPort

ASP.NET Core 2.0设置

在ASP.NET Core 2.0上,可以通过在UseKestrel()中显式调用Program.cs来实现相同的行为。您可以使用扩展方法来保持Program.cs的整洁:

public class Program {

    public static void Main(string[] args) {

        // configuration
        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true)
            .AddCommandLine(args)
            .Build();

        // service creation
        var webHost = WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseKestrelEndpoints(config) // extension method to keep things clean
            .UseConfiguration(config)
            .UseApplicationInsights()
            .Build();

        webHost.Run();

    }

}

UseKestrelEndpoints()是一种扩展方法,用于查看实际的配置设置并相应地设置Kestrel选项:

public static IWebHostBuilder UseKestrelEndpoints(this IWebHostBuilder webHostBuilder, IConfiguration configuration) {

        var endpointSection = configuration.GetSection("kestrel:endpoints");

        if (endpointSection.Exists()) {

            webHostBuilder.UseKestrel(options => {

                // retrieve url
                var httpUrl = endpointSection.GetValue<string>("http:url", null);

                /* setup options accordingly */

            });

        }

        return webHostBuilder;

    }

如果需要,您可以通过类似的方式setup HTTPS

答案 1 :(得分:0)

不幸的是,它不再起作用了。查看How to use Kestrel in ASP.NET Core apps。所以它不再适用于设置。你可以在program.cs中做这样的事情。我在这里设置了在本地使用https,但你得到了一般的想法...

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args)
    {
        IHostingEnvironment env = null;

        return WebHost.CreateDefaultBuilder(args)
              .UseStartup<Startup>()
              .ConfigureAppConfiguration((hostingContext, config) =>
              {
                  env = hostingContext.HostingEnvironment;

                  config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                          .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

                  if (env.IsDevelopment())
                  {
                      var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
                      if (appAssembly != null)
                      {
                          config.AddUserSecrets(appAssembly, optional: true);
                      }
                  }

                  config.AddEnvironmentVariables();

                  if (args != null)
                  {
                      config.AddCommandLine(args);
                  }
              })
              .UseKestrel(options =>
              {
                  if (env.IsDevelopment())
                  {
                      options.Listen(IPAddress.Loopback, 44321, listenOptions =>
                      {
                          listenOptions.UseHttps("testcert.pfx", "ordinary");
                      });
                  }
                  else
                  {
                      options.Listen(IPAddress.Loopback, 5000);
                  }
              })
              .Build();
    }
}

}