ASP.NET Core 系列之一 : ASP.NET CORE中的Web服务器的介绍


运行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 就可以了,如下图:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM