.NetCore项目在Windows IIS中部署

 

本文实例环境及版本Win10、.NetCore3.1、IIS10

一、准备

部署之前要确保你的IIS上已经安装了AspNetCoreModule托管模块,如果没有的话,可以去 https://dotnet.microsoft.com/download/dotnet 查看并选择版本下载。

关于此模块的官网介绍:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-3.1

 

 

下载完成后安装即可。安装完成后在IIS中的模块中会看到 AspNetCoreModuleV2。

 

 此处说明一下:

AspNetCoreModule(版本1)是一个IIS模块,它允许IIS运行ASP.NETCORE 1.x和2.x应用程序,当它们在.NetCore1.x和2.x(但不是.NetCore3.x和更高版本)中运行时,也可以在.NET框架上运行,而不是在.NetCore上运行。此版本在2019年1月停止使用并从ASP.NETGitHub repo中删除。今天使用V1的唯一原因是,如果您仍在运行.NetCore1.x应用程序。

AspNetCoreModuleV2 支持.NetCore 2.0及更高版本(包括.NetCore3.x、.NET 5等)。它还支持比V1更多的功能(例如自定义脱机消息)。

 

二、发布项目

 

 

 发布到指定目录下。然后再IIS中新建一个应用程序池,注意选择无托管代码。

 

 

 然后添加应用程序,选择项目的发布位置。具体的配置跟.NET Framework 一样,不再赘述。

 

 

在IIS中,官方提供了AspNetCoreModule 模块,方便将ASP.NET Core应用托管于IIS中,并提供了两种模式进程内托管(InProcess)、进程外托管(OutOfProcess),其工作方式也类似于反向代理。在Windows中,对于某些Kestrel不支持的功能,也可以使用HTTP.sys。

在 IIS 工作进程 (w3wp.exe) 内托管 ASP.NET Core 应用,称为进程内托管模型。

将 Web 请求转发到运行 Kestrel 服务器的后端 ASP.NET Core 应用,称为进程外托管模型。

在进程内托管时,该模块会使用 IIS 进程内服务器实现,即 IIS HTTP 服务器 (IISHttpServer)。

在进程外托管时,该模块仅适用于 Kestrel。 该模块无法与 HTTP.sys 一起工作。

 

三、进程内托管

进程内托管

 进程内模型不使用Kestrel,而是使用IISHttpServer直接在IIS应用程序池内部托管的新Web服务器实现,该实现与传统的ASP.NET被引入IIS的方式有些相似。

 在 InProcess 托管的情况下,CreateDefaultBuilder()方法调用UseIIS()方法并在 IIS 工作进程(w3wp.exe 或 iisexpress.exe)内托管应用程序。

如果要设置应用程序为进程内托管,需要指定< AspNetCoreHostingModel>,打开.csproj的项目文件添加如下

< AspNetCoreHostingModel>:此元素指定如何托管Asp.Net Core应用程序,它表示程序应该托管InProcess还是OutOfProcess。

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UserSecretsId>c761ed9e-6c0e-4652-a663-04fa6f756dd2</UserSecretsId> 
   <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel> </PropertyGroup> </Project>

.NetCore 3.X 默认就是进程内托管,所以可以不加。如果是.NetCore2.X由于默认是进程外托管所以需要加上面的代码

保存重新生成发布,此时会看到w3wp.exe进程启动了

 

此时的服务器类型

 

 

四、进程外托管

进程外托管

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

 打开.csproj的项目文件添加如下  OutOfProcess

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UserSecretsId>c761ed9e-6c0e-4652-a663-04fa6f756dd2</UserSecretsId>
    <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
  </PropertyGroup>
</Project>

保存后重新生成发布,此时会有一个dotnet.exe的进程

 

 此时的服务器类型

Kestrel 与 IIS 的功能比较 

https://stackify.com/kestrel-web-server-asp-net-core-kestrel-vs-iis/

 

 五、使用HTTP.sys

如果 ASP.NET Core 应用在 Windows 上运行,则 HTTP.sys 是 Kestrel 的替代选项。HTTP.sys仅能在Windows上运行,且不能与AspNetCoreModule 模块同时使用。在不想使用IIS或者需要使用Kestrel不具有的功能时可以使用HTTP.sys。

HTTP.sys 支持以下功能:

  • Windows 身份验证
  • 端口共享
  • 具有 SNI 的 HTTPS
  • 基于 TLS 的 HTTP/2(Windows 10 或更高版本)
  • 直接文件传输
  • 响应缓存
  • WebSocket(Windows 8 或更高版本)

 

 修改代码Program.cs如下:

//using Microsoft.AspNetCore.Server.HttpSys; 

public static IHostBuilder CreateHostBuilder(string[] args) =>
   Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    {
     webBuilder.UseHttpSys(options =>
      {
       options.AllowSynchronousIO = true;
       options.Authentication.Schemes = AuthenticationSchemes.None;
       options.Authentication.AllowAnonymous = true;
       options.MaxConnections = null;
       options.MaxRequestBodySize = 30000000;
       options.UrlPrefixes.Add("http://localhost:5005");
      });
     webBuilder.UseStartup<Startup>();
    });

官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/httpsys?view=aspnetcore-3.1

在命令行 dotnet run 命令或者直接双击项目.exe文件就可以访问了。此时进程名及项目的名称。

但是这种方式不能托管在IIS中,如果将发布的代码放到IIS中则会报错。

 

总结:

为了实现跨平台, 微软开发出了 Kestrel 这个 Web 服务器, 它的地位类似 Spring 中内嵌的 Tomcat, 以实现最基本、跨平台的 Web 服务, 但是原有的 IIS 依然可以直接驱动 ASP.NET Core 应用。

InProcess表示要使用进程内托管模型,即在IIS工作进程(w3wp.exe)中托管Asp.Net Core应用程序
OutOfProcess表示使用进程外托管模型,将Web请求转发到Kestrel服务器的后端Asp.Net Core应用程序中
Asp.Net Core3.x,默认使用的是进程内托管
Kestrel不与进程内托管一起使用

一般推荐的形式还是使用Kestrel作为应用服务器,使用常用的WEB服务器(Jexus,IIS,Nginx,Apache等)作为反向代理。

 才疏学浅,相关文档等仅供自我总结,如有相关问题可留言交流谢谢。

 

posted @ 2021-06-10 10:46  独角马  阅读(1068)  评论(0编辑  收藏  举报