Skip to content

ASP.net Core 跨平台原理分析 #38

@Henrik-Xu

Description

@Henrik-Xu

ASP.net core 跨平台原理分析

.NET 框架未来发展

.ASP.NET Core 跨平台运行时

ASP.NET Core 跨平台的运行时

ASP.net core 依赖注入代码分析

  1. 通过 CreateHostBuilder(args) 方法,创建了一个 HostBuilder 对象,基于建造者模式,

复杂对象创建经常使用的方法。

  1. 通过 Build() 方法调用 Startup 类中的 ConfigureServices() 方法,这个方法传递了一个服务容器,

并且注册了各种服务。

  1. 同时包括 Host 对象的创建,当然最核心的还有一个内置的 WebServer 对象。

  2. 通过 Run 方法启动和运行 Host 主机(宿主),通过 Configure() 方法配置中间管道,开始监听和接受

http 请求。

public static void Main(string[] args)
{

  IHostBuilder hostBuilder= CreateHostBuilder(args);

  IHost host = hostBuilder.Build();

  host.Run();
}

public static IHostBuilder CreateHostBuilder(string[] args)
{
  return Host.CreateDefaultBuilder(args)
          .ConfigureWebHostDefaults(webBuilder =>
          {
              webBuilder.UseStartup<Startup>();
          });
}

IIS 托管设计

托管设计

  1. ASP.NET 应用程序都是托管到(w3wp.exe)进程中,也就是应用程序池。

  2. HTTP 请求到来时,IISHttpRuntime 接受请求,并派发到对应的应用程序池和对应的托管站点

  3. 以上这些全部都是 IIS 内部完成的。

问题: IIS 从接受请求开始到响应的返回,包揽了一切,并且 IIS 只有 Windows 系统才能使用。所以,无法实现跨平台

ASP.NET CoreIIS 的关系

IIS 上部署 ASP.NET Core

  1. 安装 IIS

  2. 安装 NetCore Runtime,或者安装对应的 SDK,SDK 包括 Runtime

  3. 安装服务器主机绑定程序 Hosting, 这个程序会嵌套到 IISMoudle中,这个组件只能在 IIS 中使用。

.NetCore 变化要点

  1. 运行的位置:AspNetCore 程序不是运行在 IIS 工作进程中,而是独立的在控制台程序中运行了 Kestrel Web 服务组件。

  2. 启动的方式:Kestrel 服务是通过 dotnet 运行时命令调用的,也就是我们通过控制台启动的,就是这个服务器。

  3. 作用:AspNetCore Moudle 这个组件只是将请求转发到 Kestrel 内网服务器中并具体处理请求。

结论:.NETCore 跨平台的原因就是因为内置了 Kestrel 服务器,而不再依赖于 IIS 托管。

ASP.NET Core 请求流程

ASP.NET Core 请求处理结构图

反向代理服务器

  1. 根据客户端请求,访问防火墙后面的 web 服务器资源,并返回给客户端。

  2. 客户端只知道反向代理的 IP 地址,并不知道真实的 Web 服务器地址。

  3. 反向代理可以为后台服务器提供负载均衡,或缓冲服务器。

Kestrel 服务器内部究竟做了什么?需要源码分析。

总结

AspNetCore 是强大的控制台程序

证明:可以通过控制台启动

好处:是实现跨平台的核心

IIS 上面部署 AspNetCore 项目

要求:需要安装 Hosting 绑定模块 AspNetCoreModuleV2,并且无需托管。

作用:反向代理,用来转发请求,IIS 和转发模块,应用程序的关系更加清楚。

IIS 反向代理与 Kestrel 内置服务器

应用:反向代理服务器在 Windows 使用是 IIS,在 Linux 上使用 Nginx等。

好处:轻松实现了跨平台部署。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions