原文: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. C#高性能TCP服务的多种实现方式

    哎~~ 想想大部分园友应该对 "高性能" 字样更感兴趣,为了吸引眼球所以标题中一定要突出,其实我更喜欢的标题是<猴赛雷,C#编写TCP服务的花样姿势!>. 本篇文章的主 ...

  2. 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?

    在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成 ...

  3. 【Machine Learning】Python开发工具:Anaconda+Sublime

    Python开发工具:Anaconda+Sublime 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现 ...

  4. ASP.NET MVC5----常见的数据注解和验证

    只要一直走,慢点又何妨. 在使用MVC模式进行开发时,数据注解是经常使用的(模型之上操作),下面是我看书整理的一些常见的用法. 什么是验证,数据注解 验证 从全局来看,发现逻辑仅是整个验证的很小的一部 ...

  5. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  6. 【Update】C# 批量插入数据 SqlBulkCopy

    SqlBulkCopy的原理就是通过在客户端把数据都缓存在table中,然后利用SqlBulkCopy一次性把table中的数据插入到数据库中. SqlConnection sqlConn = new ...

  7. mysql 赋予用户权限

    # 赋予权限MySQL> grant 权限参数 on 数据库名称.表名称 to 用户名@用户地址 identified by '用户密码'; # 立即生效权限MySQL> flush pr ...

  8. 用javascript写星际飞机大战游戏

    在github里看到了个不错的脚本游戏,决定亲自动手来写,效果如下 下面是代码的思路分享 把整个代码理解消化确实不容易,但是如果你坚持看完相信你一定会有收获 如果没兴趣可以直接点击下面的链接 复制代码 ...

  9. oracle 存储过程

    来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...

  10. Spring6:基于注解的Spring MVC(上篇)

    什么是Spring MVC Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC ...