什么是宿主
ASP.NET Core应用程序需要在宿主中执行.宿主必须实现IWebHost接口,这个接口暴露了功能和服务的集合,以及Start方法。宿主通常使用WebHostBuilder的实例进行创建,该实例构建并返回一个WebHost实例。WebHost引用服务器来处理请求
宿舍和服务器的不同
宿主负责应用程序启动和生命周期管理。服务器负责接收HTTP请求。确保应用程序服务和服务器可用并正确配置也是宿主职责一部分。可以把宿主看成是服务器的包装。宿主被配置为使用一个特定的服务器;服务器并不知道它的宿主。
设置宿主
下面使用控制台程序来创建一个宿主。
然后我们在NuGet包中添加core的依赖项
最后我们Main方法中创建宿主对象
class Program { static void Main(string[] args) { var host = new WebHostBuilder() //设置端口号 UseUrls("http://*:7777;http://*:7778")//指定程序集会使用Kestrel服务器 .UseKestrel() //指定 Directory.GetCurrentDirectory 作为内容根 .UseContentRoot(Directory.GetCurrentDirectory()) //指定应用程序需要使用IIS .UseIISIntegration() //设置应用程序名称 .UseSetting("applicationName","MyHost") //捕捉异常 .CaptureStartupErrors(true) //指定程序应用程序会显示详细的启动错误信息 .UseSetting("detailedErrors","true") //设置中间件 .Configure(app=> { app.Run(async (y) => await y.Response.WriteAsync("Hello MyHost")); })
//创建宿主对象 .Build(); host.Run(); } }
上面代码中使用了WebHostBuilder类配置了宿主对象。下面我们解析各个配置的作用
UseUrls(params string[] urls)
urls设置分号(;)来分割服务器该响应的URL前缀。比如“http://localhost:7777”。域名可以用“*”替换,表明服务器需要针对任何使用指定端口及协议的IP地址或域名监听请求。协议(“http://”或“https://”)必须包含在每个URL里,前缀由配置好的服务器解释;服务器之间支持的格式有所不同。这个例子中我们同事可以使用7777端口和77778端口同时访问
UseKesttrel()
WebHostBuilder需要你提供实现了IServer接口的服务器。Usekestrel指定应用程序会使用Kestrel服务器
UerContentRoute(string contentRoute)
服务器的内容根(content root)决定它将在哪里搜索内容文件,比如MVC视图文件。默认的内容根是应用程序运行的文件夹
注意:指定Directory.GetCurrentDirectory作为内容根时,当应用程序启动时会使用Web项目的根目录作为应用程序的内容根(比如,从Web项目文件夹调用 dotnet run)。Visual Studio 和dotnet new 的模板时默认使用Directory.GetCurrentDirectory作为内容根的。
UseIISIntegration()
如果应用程序需要使用IIS,需要构建宿主时调用UseIISIntegration方法。注意这不是像UseKestrel那样配置一个服务器。为了让ASP.NET Core使用IIS,必须同时指定UseKestrel和UseIISIntegration。Kestrel被设计为在代理后运行而不应该直接部署到互联网。UseIISIntegration指定IIS为反向代理服务器。
注意:UseKestrel和UseIISIntegration行为区别非常大,IIS只是作为一个反向代理。UseKestrel创建Web服务器并且对代码进行托管。UseIISIntegration指定IIS作为泛型代理服务器。它同时也检查了IIS/IISExpress使用的环境变量并作出比如使用哪个动态端口,设置什么Header等绝对,然而它不处理或创建IServer
UseSetting(string key,string value)
WebHostBuilder提供了方法用于为宿主设置大多数可用的配置值,它也可以被配置为直接使用的UseSetting以及相关的键,比如指定应用程序名称(“applicationName”)和指定是否启动显示详细错误信息(“detailedErrors”)
CaptureStartupErrors(bool captureStartupErrors)
设置是否启动异常捕捉,默认为false,当值为false时,在启动过程中的错误会导致宿主退出。当值为true时,宿主会捕捉Startup类中的任何异常,并试图启动服务器。
Configure( Action<IApplicationBuilder> configureApp)
添加中间件到宿主中
Build()
创建宿主对象,返回一个IWebHost接口派生类对象
最后我们启动服务器进行测试