Kestrel 是一个跨平台的适用于 ASP.NET Core 的 Web 服务器。ASP.NET Core模板项目使用Kestrel作为默认的web服务器

时间:2019-05-17
本文章向大家介绍Kestrel 是一个跨平台的适用于 ASP.NET Core 的 Web 服务器。ASP.NET Core模板项目使用Kestrel作为默认的web服务器,主要包括Kestrel 是一个跨平台的适用于 ASP.NET Core 的 Web 服务器。ASP.NET Core模板项目使用Kestrel作为默认的web服务器使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

何时结合使用 Kestrel 和反向代理

Kestrel 是一个跨平台的适用于 ASP.NET Core 的 Web 服务器。ASP.NET Core模板项目使用Kestrel作为默认的web服务器。

可以单独使用 Kestrel,也可以将其与反向代理服务器(如IISNginx 或 Apache)结合使用。 反向代理服务器接收来自网络的 HTTP 请求,并将这些请求转发到 Kestrel

Kestrel 用作边缘(面向 Internet)Web 服务器:

Kestrel 用于反向代理配置:

无论配置是否使用反向代理服务器——,都是从 Internet 接收请求的 ASP.NET Core 2.1 或更高版本应用的支持托管配置。

在没有反向代理服务器的情况下用作边缘服务器的 Kestrel 不支持在多个进程间共享相同的 IP 和端口。 如果将 Kestrel 配置为侦听某个端口,Kestrel 会处理该端口的所有流量(无视请求的 Host 标头)。 可以共享端口的反向代理能在唯一的 IP 和端口上将请求转发至 Kestrel。

即使不需要反向代理服务器,使用反向代理服务器可能也是个不错的选择。

反向代理:

  • 可以限制所承载的应用中的公开的公共外围应用。
  • 提供额外的配置和防护层。
  • 可以更好地与现有基础结构集成。
  • 简化了负载均和和安全通信 (HTTPS) 配置。 仅反向代理服务器需要 X.509 证书,并且该服务器可使用普通 HTTP 在内部网络上与应用服务器通信。

.Net Core的托管模式主要分2种:进程内托管和进程外托管 

默认为OutOfProcess进程外托管模式

在 IIS 工作进程 (w3wp.exe) 内托管 ASP.NET Core 应用,称为进程内托管模型。
将 Web 请求转发到运行 Kestrel 服务器的后端 ASP.NET Core 应用,称为进程外托管模型。

用于 ASP.NET Core 的最常见进程管理器是:

  • Linux
    • Nginx
    • Apache
  • Windows
    • IIS
    • Windows 服务

选择哪种托管模式取决于个人,但是一般推荐使用 “进程内托管” 模式,使用 “进程内托管”可依托 IIS 获得更高的吞吐量,下面来了解一下两种不同的托管模式的区别,选择不同的托管模式可通过修改配置文件 web.config 来完成配置选择:

  • 首先看一个标准的 Asp.Net Core web.config 配置文件
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" 
             path="*" verb="*" 
             modules="AspNetCoreModuleV2" 
             resourceType="Unspecified" />
      </handlers>      
      <aspNetCore processPath="dotnet" 
                  arguments=".\Deploy.IIS.dll" 
                  stdoutLogEnabled="false" 
                  stdoutLogFile=".\logs\stdout" 
                  hostingModel="outofprocess" />
    </system.webServer>
  </location>
</configuration>
<!--ProjectGuid: ea8ea1cd-a655-48c6-ad48-1cca646c2db7-->
  • 在节点 system.webServer/aspNetCore.hostingModel 中,可以选择的值为:inprocess(进程内托管)/outofprocess(进程外托管),通过设置 hostingModel 的值来选择不同的托管模式

  • 进程内托管

选择进程内托管,意味着将 .NetCore 应用程序的工作进程托管到 IIS 的工作进程 w3wp.exe 中,使用的 IIS 进程内服务器,即使用的是:IISHttpServer。

  • 进程外托管

选择进程外托管时,web.config 配置节点 system.webServer/aspNetCore.hostingModel 的值必须设置为:outofprocess,选择进程外托管,实际上就是告诉 IIS ,当前应用程序不使用 IISHttpServer,改为使用 Kestrel 服务器

  • 不同托管模式下代码的变化

当你在 Program.cs 中使用默认的代码创建服务器的时候,不管使用的是 inprocess 还是 outofprocess ,代码是无需改变的,就像下面的代码,其中,要关注的代码是:WebHost.CreateDefaultBuilder(args),表示使用默认的构建

  public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                   .UseStartup<Startup>();
    }

但是,当你使用 outofprocess(进程外托管模型)时,如果是使用自定义构建服务器时,就必须注意,比如,下面的代码 new WebHostBuilder().UseKestrel(),这个时候,就必须显式的指定 UseKestrel ;否则,服务器将无法启动,如果使用了 UseKestrel 又想切换到 inprocess(进程内托管),就必须移除 .UseKestrel(),官网的介绍是在 .UseKestrel() 后面紧跟 .UseIISIntegration(),这样你就可以愉快的切换来切换去了(但是我测试的结果是必须移除);
或者,像下面的代码,使用

.UseKestrel()
.UseIIS()
.UseIISIntegration()
  • 强烈建议使用 WebHost.CreateDefaultBuilder(args) 的默认构造,别去踩那么多的坑
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            return new WebHostBuilder()
                .UseKestrel()
                .UseIIS()
                .UseIISIntegration()
                .UseStartup<Startup>();
        }
    }

ASP.Net Core使用的是自托管web服务器:Kestrel

ASP.Net 使用的是web服务器:IIS Express

发布.Net Core程序的时候,应用程序池选择了无托管代码并不是以前的托管代码,所以IIS并不会去处理你的程序,他只处理你的请求,所以IIS目前对于.Net Core程序只充当反向代理的角色,转发请求到Kestrel;  

与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel不同端口的ASP.NET Core程序中,随后就将接收到的请求推送至中间件管道中去,处理完你的请求和相关业务逻辑之后再将HTTP响应数据重新回写到IIS中,最终转达到不同的客户端(浏览器,APP,客户端等)。

而配置文件和过程都会由些许调整,中间最重要的角色便是AspNetCoreModule,它是其中一个的IIS模块,请求进入到IIS之后便立即由它转发,并迅速重定向到ASP.NET Core项目中,所以这时候我们无需设置应用程序池来托管我们的代码,它只负责转发请求而已。

(部署之前要确保你的IIS上已经安装了AspNetCoreModule托管模块)

原文地址:https://www.cnblogs.com/ghostdao/p/10879856.html