ASP.NET Core 中文文档 第三章 原理(12)托管
原文: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,你必须同时指定 UseKestrel
和 UseIISIntegration
。Kestrel 被设计为在代理后运行而不应该直接部署到互联网。UseIISIntegration
指定 IIS 为反向代理服务器。
注解
UseKestrel
与UseIISIntegration
行为区别非常大。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();
注解
当设置一个宿主,你可以提供Configure
和ConfigureServices
方法,或者定义一个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();
额外的资源
- Publishing to IIS
- Publish to a Linux Production Environment
- Hosting ASP.NET Core as a Windows Service
- Hosting ASP.NET Core Embedded in Another Application
ASP.NET Core 中文文档 第三章 原理(12)托管的更多相关文章
- ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化
原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...
- ASP.NET Core 中文文档 第三章 原理(1)应用程序启动
原文:Application Startup 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程 ...
- ASP.NET Core 中文文档 第三章 原理(13)管理应用程序状态
原文:Managing Application State 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:高嵩 在 ASP.NET Core 中,有多种途径可以对应用程序的状态进行 ...
- ASP.NET Core 中文文档 第三章 原理(2)中间件
原文:Middleware 作者:Steve Smith.Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:许登洋(Seay) 章节: 什么是中间件 用 IApplicationBu ...
- ASP.NET Core 中文文档 第三章 原理(3)静态文件处理
原文:Working with Static Files 作者:Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay).孟帅洋(书缘) 静态文 ...
- ASP.NET Core 中文文档 第三章 原理(10)依赖注入
原文:Dependency Injection 作者:Steve Smith 翻译:刘浩杨 校对:许登洋(Seay).高嵩 ASP.NET Core 的底层设计支持和使用依赖注入.ASP.NET Co ...
- ASP.NET Core 中文文档 第三章 原理(11)在多个环境中工作
原文: Working with Multiple Environments 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core 介绍了支持在多个环境中管 ...
- ASP.NET Core 中文文档 第三章 原理(17)为你的服务器选择合适版本的.NET框架
原文:Choosing the Right .NET For You on the Server 作者:Daniel Roth 翻译:王健 校对:谢炀(Kiler).何镇汐.许登洋(Seay).孟帅洋 ...
- ASP.NET Core 中文文档 第三章 原理(7)配置
原文:Configuration 作者:Steve Smith.Daniel Roth 翻译:刘怡(AlexLEWIS) 校对:孟帅洋(书缘) ASP.NET Core 支持多种配置选项.应用程序配置 ...
- ASP.NET Core 中文文档 第三章 原理(8)日志
原文:Logging 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:何镇汐.许登洋(Seay) ASP.NET Core 内建支持日志,也允许开发人员轻松切换为他们想用的其他日 ...
随机推荐
- C#高性能TCP服务的多种实现方式
哎~~ 想想大部分园友应该对 "高性能" 字样更感兴趣,为了吸引眼球所以标题中一定要突出,其实我更喜欢的标题是<猴赛雷,C#编写TCP服务的花样姿势!>. 本篇文章的主 ...
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?
在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成 ...
- 【Machine Learning】Python开发工具:Anaconda+Sublime
Python开发工具:Anaconda+Sublime 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现 ...
- ASP.NET MVC5----常见的数据注解和验证
只要一直走,慢点又何妨. 在使用MVC模式进行开发时,数据注解是经常使用的(模型之上操作),下面是我看书整理的一些常见的用法. 什么是验证,数据注解 验证 从全局来看,发现逻辑仅是整个验证的很小的一部 ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- 【Update】C# 批量插入数据 SqlBulkCopy
SqlBulkCopy的原理就是通过在客户端把数据都缓存在table中,然后利用SqlBulkCopy一次性把table中的数据插入到数据库中. SqlConnection sqlConn = new ...
- mysql 赋予用户权限
# 赋予权限MySQL> grant 权限参数 on 数据库名称.表名称 to 用户名@用户地址 identified by '用户密码'; # 立即生效权限MySQL> flush pr ...
- 用javascript写星际飞机大战游戏
在github里看到了个不错的脚本游戏,决定亲自动手来写,效果如下 下面是代码的思路分享 把整个代码理解消化确实不容易,但是如果你坚持看完相信你一定会有收获 如果没兴趣可以直接点击下面的链接 复制代码 ...
- oracle 存储过程
来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...
- Spring6:基于注解的Spring MVC(上篇)
什么是Spring MVC Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC ...