.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等)作为反向代理。
才疏学浅,相关文档等仅供自我总结,如有相关问题可留言交流谢谢。