用"hosting.json"配置ASP.NET Core站点的Hosting环境

通常我们在 Prgram.cs 中使用硬编码的方式配置 ASP.NET Core 站点的 Hosting 环境,最常用的就是 .UseUrls() 。

public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseUrls("http://*:5000")
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseStartup<Startup>()
            .Build();

        host.Run();
    }
}

但这种硬编码绑定端口的方式会给在同一台 Linux 服务器上部署多个站点造成麻烦,因为不同站点需要绑定不同的端口。除非你在开发时就已经约定好各个项目使用的端口,否则很容易在部署时遇到端口冲突问题,从而被迫修改代码。

如果能通过配置文件设置绑定的端口,这个问题就迎刃而解。ASP.NET Core 中有没有提供相应的解决之道呢?带着这个问题,今天签出 aspnet/Hosting 的源码浏览一番,在 SampleStartups 的 StartupFullControl.cs 中找到了答案:

var config = new ConfigurationBuilder()
    .AddCommandLine(args)
    .AddEnvironmentVariables(prefix: "ASPNETCORE_")
    .AddJsonFile("hosting.json", optional: true)
    .Build();

var host = new WebHostBuilder()
    .UseConfiguration(config)

原来可以通过 hosting.json 进行配置,下面实际体验一下。

首先创建一个 hosting.json 文件:

{
  "server.urls": "http://*:5000;http://*:8001",
  "environment": "Development"
}

上面的配置中除了配置 server.urls ,也顺带配置了一下 environment (默认是Production)。

然后在 Program.cs 中使用 hosting.json 中的配置:

public class Program
{
    public static void Main(string[] args)
    {
        var config = new ConfigurationBuilder()
            .AddJsonFile("hosting.json", optional: true)
            .Build();

        var host = new WebHostBuilder()
            .UseUrls("http://*:5000")
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseStartup<Startup>()
            .UseConfiguration(config)
            .Build();

        host.Run();
    }
}

注意一定要把上面的 .UseUrls() 删除,不然 hosting.json 中的配置会被它覆盖。

另外还要注意,在 project.json 中除了在 "publishOptions" 中添加 "hosting.json" ,还要在 "buildOptions" -> "copyToOutput" 中添加 "hosting.json",不然运行时在 bin 文件夹会找不到 hosting.json 文件。

"buildOptions": {
  "emitEntryPoint": true,
  "preserveCompilationContext": true,
  "copyToOutput": "hosting.json"
},
"publishOptions": {
  "include": [
    "hosting.json"
  ]
}

最后用 dotnet run 命令运行站点,体验一下实际效果。

Hosting environment: Development
Content root path: C:\Dev\Cnblogs.WebDemo
Now listening on: http://*:5000
Now listening on: http://*:8001
Application started. Press Ctrl+C to shut down.

【补充】ASP.NET Core 2.0 中的使用方法:

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

    public static IWebHost BuildWebHost(string[] args)
    {
        var config = new ConfigurationBuilder()
        .AddJsonFile("hosting.json", optional: true)
        .AddCommandLine(args)
        .Build();

        return WebHost.CreateDefaultBuilder(args)                
            .UseConfiguration(config)
            .UseStartup<Startup>()
            .Build();
    }
}

【更新】从 .NET Core 2.1 开始,可以直接写在 appsettings.json 中。

"Kestrel": {
  "EndPoints": {
    "Http": {
      "Url": "http://*:30080"
    }
  }
}
posted @ 2016-12-29 15:18  dudu  阅读(3351)  评论(6编辑  收藏  举报