原文:Hosting

作者:Steve Smith

翻译:娄宇(Lyrics)

校对:何镇汐许登洋(Seay)

为了运行 ASP.NET Core 应用程序,你需要使用 WebHostBuilder 配置和启动一个宿主.

什么是宿主?

ASP.NET Core 应用程序需要在宿主中执行。宿主必须实现 IWebHost 接口,这个接口暴露了功能和服务的集合,以及 Start 方法。宿主通常使用 WebHostBuilder 的实例进行创建,该实例构建并返回一个 WebHost 实例。WebHost 引用服务器来处理请求。学习更多关于 服务器

宿主和服务器的不同之处是什么?

宿主负责应用程序启动和生命周期管理。服务器负责接受 HTTP 请求。确保应用程序服务和服务器可用并正确配置也是宿主职责的一部分。你可以把宿主看作是服务器的包装。宿主被配置为使用一个特定的服务器;服务器并不知道它的宿主。

设置宿主

使用 WebHostBuilder 实例创建一个宿主。这通常是在你的应用程序入口点:public static void Main,(在项目模板的 Program.cs 文件中)。一个典型的 Program.cs 如下所示,演示如何使用 WebHostBuilder 来构建一个宿主。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting; namespace WebApplication1
{
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build(); host.Run();
}
}
}

WebHostBuilder 负责创建宿主,宿主会启动应用程序服务器。WebHostBuilder 需要你提供实现了 IServer (上面代码中的 UseKestrel) 接口的服务器。 UseKestrel 指定应用程序会使用 Kestrel 服务器。

服务器的 内容根 ( content root ) 决定它将在哪里搜索内容文件,比如 MVC 视图文件。默认的内容根是应用程序运行的文件夹。

注解

指定 Directory.GetCurrentDirectory 作为内容根时,当应用程序启动时会使用 Web 项目的根目录作为应用程序的内容根(比如,从 Web 项目文件夹调用 dotnet run)。Visual Studio 和 dotnet new 的模板是默认使用 Directory.GetCurrentDirectory 作为内容根的。

如果应用程序需要使用 IIS,需要在构建宿主时调用 UseIISIntegration 方法。注意这不是像 UseKestrel 那样配置一个 服务器。为了让 ASP.NET Core 使用 IIS,你必须同时指定 UseKestrelUseIISIntegration。Kestrel 被设计为在代理后运行而不应该直接部署到互联网。UseIISIntegration 指定 IIS 为反向代理服务器。

注解

UseKestrelUseIISIntegration 行为区别非常大。IIS 只是作为一个反向代理。UseKestrel 创建 Web 服务器并且对代码进行托管。UseIISIntegration 指定 IIS 作为反向代理服务器。它同时也检查了 IIS/IISExpress 使用的环境变量并做出比如使用哪个动态端口,设置什么 Header 等决定。然而它不处理或者创建 IServer

配置一个宿主(以及一个 ASP.NET Core 应用程序)的最小实现仅仅包含一个服务器和应用程序请求管道的配置:

var host = new WebHostBuilder()
.UseKestrel()
.Configure(app =>
{
app.Run(async (context) => await context.Response.WriteAsync("Hi!"));
})
.Build(); host.Run();

注解

当设置一个宿主,你可以提供 ConfigureConfigureServices 方法,或者定义一个 Startup 类(也必须定义这些方法,参见 :doc:startup)。多次调用 ConfigureServices 会进行追加配置;多次调用 Configure 或者 UseStartup 会替换之前的设置。

配置宿主

WebHostBuilder 提供了方法用于为宿主设置大多数可用的配置值,它也可以被设置为直接使用 UseSetting 以及相关的键。比如,指定应用程序名字:

new WebHostBuilder()
.UseSetting("applicationName", "MyApp")

宿主配置值

应用程序名 string

键: applicationName。这个配置设定指定的值将从 IHostingEnvironment.ApplicationName 返回。

捕获启动异常 bool

键: captureStartupErrors。默认是 false。当值为 false 时,在启动过程中的错误会导致宿主退出。当值为 true 时,宿主会捕捉 Startup 类中的任何异常,并试图启动服务器。同时将为每个请求显示错误页面(一般的,或详细的,这取决于下面提到的详细错误设置)。 可使用 CaptureStartupErrors 方法设置。

new WebHostBuilder()
.CaptureStartupErrors(true)

内容根 string

Key: contentRoot。默认是应用程序集所在的文件夹(针对 Kestrel;IIS 默认使用 Web 项目根目录)。这个设置决定了 ASP.NET Core 从哪里开始搜索内容文件,比如 MVC 视图。内容根同时被作为 Web 根设置 的基础路径使用。可使用 UseContentRoot 方法设置。路径必须是存在的,否则宿主会启动失败。

new WebHostBuilder()
.UseContentRoot("c:\\mywebsite")

详细错误 bool

键: detailedErrors。默认是 false。当值是 true 时(或者当环境设置为“Development”时),应用程序会显示详细的启动错误信息,而不仅仅是一般的错误页。可使用 UseSetting 设置。

new WebHostBuilder()
.UseSetting("detailedErrors", "true")

当详细错误设置为 false 并且捕捉启动异常是 true 时,服务器在每个请求的(错误)响应中显示一般错误页。

当详细错误设置为 true 并且捕捉启动异常是 true 时,服务器在每个请求的(错误)响应中显示详细错误页。

环境 string

键: environment。默认是“Production”。可以设置为任何值。框架定义的值包含“Development”,“Staging”,以及“Production”。值不区分大小写。参见 environments。可使用 UseEnvironment 方法设置。

new WebHostBuilder()
.UseEnvironment("Development")

注解

默认情况下,环境是从 ASPNETCORE_ENVIRONMENT 环境变量中读取。当使用 Visual Studio,环境变量可能在 launchSettings.json 文件中进行设置。

服务器 URLs string

键: urls。设置分号(;)来分隔服务器应该响应的 URL 前缀。比如,"http://localhost:123"。域名可以用“”替换,表明服务器需要针对任何使用指定端口及协议的 IP 地址或域名监听请求(比如,“http://:5000”或者 “https://*:5001”)。协议(“http://”或者“https://”)必须包含在每个URL里。前缀由配置好的服务器解释;服务器之间支持的格式会有所不同。

new WebHostBuilder()
.UseUrls("http://*:5000;http://localhost:5001;https://hostname:5002")

启动程序集 string

键: startupAssembly。决定搜索 Startup 类的程序集。可使用 UseStartup 方法设置。可以使用 WebHostBuilder.UseStartup<StartupType> 指定特定的引用类型。如果调用多次 UseStartup 方法,最后一个调用的生效。

new WebHostBuilder()
.UseStartup("StartupAssemblyName")

Web 根 string

键: webroot。如果不指定,默认是 (Content Root Path)\wwwroot,如果该路径存在。如果这个路径不存在,则使用一个没有文件操作的提供器。可使用 UseWebRoot 方法设置。

new WebHostBuilder()
.UseWebRoot("public")

使用 configuration 来设置宿主所需的配置值。这些值可能随后被重写。可使用 UseConfiguration 指定。

public static void Main(string[] args)
{
var config = new ConfigurationBuilder()
.AddCommandLine(args)
.AddJsonFile("hosting.json", optional: true)
.Build(); var host = new WebHostBuilder()
.UseConfiguration(config)
.UseKestrel()
.Configure(app =>
{
app.Run(async (context) => await context.Response.WriteAsync("Hi!"));
})
.Build(); host.Run();
}

在上面的例子中,可以通过命令行参数配置宿主,或者在 hosting.json 文件中进行配置。要指定在特定的网址上运行宿主,你可以从命令行传递所需要的值:

dotnet run --urls "http://*:5000"

Run 方法启动 Web 应用程序并且阻止调用线程,直到宿主关闭。

host.Run();

你可以通过调用宿主的 Start 方法来以非阻塞方式运行宿主。

using (host)
{
host.Start();
Console.ReadLine();
}

传递一个 URL 列表到 Start 方法,它将监听指定的 URL:

var urls = new List<string>() {
"http://*:5000",
"http://localhost:5001"
};
var host = new WebHostBuilder()
.UseKestrel()
.UseStartup<Startup>()
.Start(urls.ToArray()); using (host)
{
Console.ReadLine();
}

排序的重要性

WebHostBuilder 首先读取某些环境变量中的设置(如果环境变量中设置了)。这些环境变量必须采用格式 ASPNETCORE_{configurationKey},因此假如要设置默认情况下服务器监听的 URL,你需要设置 ASPNETCORE_URLS

你可以通过指定配置来重写任何环境变量(使用 UseConfiguration)或者明确地设置值(例如使用 UseUrls)。宿主会使用任何选项最后设置的值。因此,UseIISIntegration 必须出现在 UseUrls 之后,因为它将替换 IIS 动态提供的 URL。如果你想以编程方式设置默认 URL 的值,但是允许他通过配置重写,你需要如下配置宿主:

var config = new ConfigurationBuilder()
.AddCommandLine(args)
.Build(); var host = new WebHostBuilder()
.UseUrls("http://*:1000") // default URL
.UseConfiguration(config) // override from command line
.UseKestrel()
.Build();

额外的资源

ASP.NET Core 中文文档 第三章 原理(12)托管的更多相关文章

  1. ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化

    原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...

  2. ASP.NET Core 中文文档 第三章 原理(1)应用程序启动

    原文:Application Startup 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程 ...

  3. ASP.NET Core 中文文档 第三章 原理(13)管理应用程序状态

    原文:Managing Application State 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:高嵩 在 ASP.NET Core 中,有多种途径可以对应用程序的状态进行 ...

  4. ASP.NET Core 中文文档 第三章 原理(2)中间件

    原文:Middleware 作者:Steve Smith.Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:许登洋(Seay) 章节: 什么是中间件 用 IApplicationBu ...

  5. ASP.NET Core 中文文档 第三章 原理(3)静态文件处理

    原文:Working with Static Files 作者:Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay).孟帅洋(书缘) 静态文 ...

  6. ASP.NET Core 中文文档 第三章 原理(10)依赖注入

    原文:Dependency Injection 作者:Steve Smith 翻译:刘浩杨 校对:许登洋(Seay).高嵩 ASP.NET Core 的底层设计支持和使用依赖注入.ASP.NET Co ...

  7. ASP.NET Core 中文文档 第三章 原理(11)在多个环境中工作

    原文: Working with Multiple Environments 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core 介绍了支持在多个环境中管 ...

  8. ASP.NET Core 中文文档 第三章 原理(17)为你的服务器选择合适版本的.NET框架

    原文:Choosing the Right .NET For You on the Server 作者:Daniel Roth 翻译:王健 校对:谢炀(Kiler).何镇汐.许登洋(Seay).孟帅洋 ...

  9. ASP.NET Core 中文文档 第三章 原理(7)配置

    原文:Configuration 作者:Steve Smith.Daniel Roth 翻译:刘怡(AlexLEWIS) 校对:孟帅洋(书缘) ASP.NET Core 支持多种配置选项.应用程序配置 ...

  10. ASP.NET Core 中文文档 第三章 原理(8)日志

    原文:Logging 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:何镇汐.许登洋(Seay) ASP.NET Core 内建支持日志,也允许开发人员轻松切换为他们想用的其他日 ...

随机推荐

  1. Dapper扩展之~~~Dapper.Contrib

    平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html#skill 上一篇文章:Dapper逆天入门~强类型,动态类型 ...

  2. 在Sublime Text 3上安装代码格式化插件CodeFormatter

    1.了解CodeFormatter插件 在Sublime Text 3中编写代码,为了能让我们的代码格式变得漂亮整洁,需要一个能自动格式代码的插件.这里发现CodeFormatter插件不错,它能支持 ...

  3. Android带加减的edittext

    看了网上这样自带加减的edittext写得好复杂,还有各种监听事件,我觉得没有必有.于是我自己写了一个. 我这个edittext仅仅限制整数,每次加减1. public class TestEditT ...

  4. java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)

    一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...

  5. 【读书】PHP程序员要读的书目(不断完善中)

    本文地址 分享提纲: 1. PHP 2. Linux 3. Apache/Nginx 4. Mysql 5.设计模式/架构 6. 缓存并发 7. 其他语言 8. 代码基础 9. 大前端 10. 管理生 ...

  6. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  7. 通过sails和阿里大于实现短信验证

    通过sails与阿里大于来实现注册短信验证码的发送,逻辑图如下 1.用户在客户端发送手机号给服务器,服务器接收到手机号,生成对应时间戳,随机四位数验证码 2.服务器将电话号码和验证码告诉阿里大于服务器 ...

  8. 升级npm

    查看npm的所有版本 运行命令: npm view npm versions 命令运行后,会输出到目前为止npm的所有版本. [ '1.1.25', '1.1.70', '1.1.71', '1.2. ...

  9. 编译器开发系列--Ocelot语言4.类型定义的检查

    这里主要介绍一下检查循环定义的结构体.联合体.是对成员中包含自己本身的结构体.联合体进行检查.所谓"成员中包含自己本身",举例来说,就是指下面这样的定义. struct point ...

  10. 数据分布转换:非正态 -> 正态

    来源:丁香园论坛:SPSS上的把非正态分布数据转换为正态分布数据 一楼 可以应用变量变换的方法,将不服从正态分布的资料转化为非正态分布或近似正态分布.常用的变量变换方法有对数变换.平方根变换.倒数变换 ...