运行ASP.NET Core Web应用(包括 Razor 和 WebAPI),要先配置合适的 HTTP 服务器(或称 Web 服务器,
这两者表达的含义是一样的,HTTP是从协议的角度来说的,Web是从表现形式来说的,
我们现在用到的Web技术,比如ASP.NET、JSP、PHP、Python等都是建立在HTTP协议的基础上的),
HTTP 服务器的作用是监听网络端口,然后处理客户端发送过来的请求,并将请求的资源(或数据)返回给客户端。
在这个过程中,我们来具体看一看.NET Core 是如何工作的。
1. ASP.NET Core 时代的 HTTP 服务器 。
与传统的 Web服务器 IIS 不同,ASP.NET CORE 是将服务器内置到项目中的,
它提供了2种内置的HTTP服务器,分别是:
- Kestrel 服务器(可以跨平台,微软推荐,这也是默认选项)
- HTTP.sys 服务器(只能用于 Windows,要使用的话需要显式配置)
他们的工作流程是一样的,如下图:
Kestrel:
HTTP.sys
其区别如下(来自官方文档):
2. ASP.NET CORE项目如何选择用【HTTP.sys 服务器】。
默认情况下,ASP.NET Core 项目模板使用 Kestrel。 在 Program.cs 中,
ConfigureWebHostDefaults() 方法内部调用了 UseKestrel:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => {webBuilder.UseStartup<Startup>();});
如果要更改此默认值,使用 HTTP.sys,可以将代码修改如下(见红色部分):
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseHttpSys(options => { options.AllowSynchronousIO = false; options.Authentication.Schemes = AuthenticationSchemes.None; options.Authentication.AllowAnonymous = true; options.MaxConnections = null; options.MaxRequestBodySize = 30000000; options.UrlPrefixes.Add("http://localhost:5005"); }); webBuilder.UseStartup<Startup>(); });
使用 HTTP.sys要特别注意:
- HTTP.sys 与 ASP.NET Core 模块不兼容,无法与 IIS 或 IIS Express 结合使用。
- IIS 本身作为 HTTP.sys 之上的 HTTP 侦听器运行。
3. 为什么ASP.NET CORE要将Web服务器内置到项目中。
- 部署方便(随身携带,不用在目标系统上单独安装);
- 便于管理(.NET CORE为我们提供了很多方法来操作它);
- 跨平台(一次编写,到处运行);
4. 如何用 Kestrel (不使用IIS)来部署Web服务。
以我们之前的权限管理项目为例:
其路径是:
第1步:打开命令提示符,如下:
第2步:依次输入"d:" 回车,"cd dotnet5demo\RazorDemo\AuthManagement\AuthManagement" 回车,
将命令提示符的路径指到 Web项目所在的路径,也就是包含 "AuthManagement.csproj" 文件的目录,如下图:
命令提示符中的路径必须是项目的路径,如下:
先将"bin"和"obj"目录下的文件全部删除。
在开始第3步之前我们先用浏览器访问一下项目,得到如下结果:
第3步:在命令提示符下输入"dotnet run" 回车,如下:
可以看到 Web项目已经编译完成并监听 "http://localhost:5000" 这个网址和端口,开始提供Web服务了。
(此时可以看到Web项目的 bin 目录下生成了一个 debug 文件夹,这就是编译生成的Debug版本 )
此时再打开浏览器并刷新,画面如下:
项目内置的 Kestrel 服务器已经可以提供服务了。
5. Kestrel 服务器 与 IIS结合使用。
Kestrel 还能与其他WEB服务器(如 IIS、Nginx、Apache等)结合使用,此时的WEB服务器作为 Kestrel 的反向代理服务器,
接收来自 Internet 的 HTTP 请求,并将这些请求转发到 Kestrel ,其工作流程如下:
微软官方推荐使用反向代理,给出的原因如下:
6. 什么是反向代理服务器。
我们常说的代理是指正向代理,用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,
并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。正向代理的过程,它隐藏了真实的请求客户端,
服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,如下图:
反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;
并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器,如下图:
简而言之:
两者的区别在于代理的对象不一样:【正向代理】代理的对象是客户端,【反向代理】代理的对象是服务端。
7. 为什么我们用 dotnet run命令启动 Kestrel 服务器的端口是 5000 而不是其他。
是因为项目的 launchSettings.json 文件中设置的 applicationUrl 是 http://localhost:5000 的缘故,如下:
"AuthManagement": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, "applicationUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }
这里的端口号如果修改成其他值,那么执行 dotnet run 命令后浏览器也要用对应的端口号来访问。
8. 如何关闭 Kestrel 服务器。
如果要关闭 Kestrel 服务器,在命令提示符下按 Ctrl+C 就可以了,如下图: