原文:https://www.cnblogs.com/i3yuan/p/10988358.html
一、前言:
当构建一个ASP.NET Core应用程序并且计划将其运行在IIS中时,你会发现Core应用程序和之前版本的ASP.NET程序在IIS中的运行方式是完全不一样的。
与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel不同端口的ASP.NET Core程序中,随后就将接收到的请求推送至中间件管道中去,处理完你的请求和相关业务逻辑之后再将HTTP响应数据重新回写到IIS中,最终转达到不同的客户端(浏览器,APP,客户端等)。
而配置文件和过程都会有些许调整,中间最重要的角色便是AspNetCoreModule,它是其中一个的IIS模块,请求进入到IIS之后便立即由它转发,并迅速重定向到ASP.NET Core项目中,所以这时候我们无需设置应用程序池来托管我们的代码,它只负责转发请求而已。
回顾之前的ASP.NET的经典托管
在经典ASP.NET应用程序中,所有一切都托管在IIS工作进程中(w3wp.exe),这也被称为IIS应用程序池。ASP.NET程序被托管在应用程序池中,并且被按照IIS内建的ASP.NET托管特性所实例化。当请求从http.sys传入到ASP.NET应用程序管道时,本地运行时管理器会实例化一个代表应用程序的.NET运行时,同时引入HttpRuntime对象用来处理这个请求。来自http.sys的请求被派送到对应的应用程序池和HttpRuntime实例的托管站点。
ASP.NET CORE与IIS
ASP.NET Core则完全不同,它并不是运行在IIS的工作进程中,而是独立运行的。它运行于控制台应用程序之中,控制台中则运行了Kestrel Web服务器组件。Kestrel作为一款.NET Web服务器的实现,它在吞吐量性能方面做了很多工作。它可以快速将来自网络的请求接入到应用程序中,但是它仅仅是一个最基本的Web服务器。它没有类似IIS的Web管理服务,也没有IIS那么多的功能。
ASP.NET Core程序独立运行在控制台应用程序中,并通过dotnet运行时命令调用。它并没有被加载到IIS工作进程中,但是IIS却加载了名为AspNetCoreModule的本地Module,这个Module用于执行外部的控制台程序。AspNetCoreModule是作为ASP.NET Core Server Hosting Bundle的一部分被安装在服务器上的。
部署之前要确保你的IIS上已经安装了AspNetCoreModule托管模块,如果没有的话,用以下链接下载安装程序:
- 在 IIS 服务器上运行安装程序。
- 重启服务器或在命令行界面中执行
net stop was /y
,后跟net start w3svc
。
二、开始:
1、安装IIS
在控制面板→程序→启用或关闭Windows功能→勾选Internet Information Services以及Web管理工具下的IIS管理控制台
2、发布项目
发布我们建好的ASP.NET Core项目,然后选择IIS,新建一项发布配置
3、在IIS上绑定添加网站
添加一个网站,设置一下名称,并将路径指向你刚才发布的文件夹,然后启动网站即可
设置应用程序池的.NET CLR版本为“无托管代码”,因为刚才也说了,IIS是作为一个反向代理的角色,并不需要它来托管代码
4、浏览网站
这个时候出现了这个问题
错误分析:
IIS服务器上的.net core 运行时不是最新的,导致AspNetCoreModuleV2模块缺失或者报错
检查发现 项目的版本是 .netcore2.2 ,而运行时安装的为 .netcore runtime 2.1.6
查看程序 如果没有安装.netcore2.2 就需要安装
下载完成后安装
就可以打开网站了
三、总结:
至此,整个IIS的搭建已经完成,作为个人的笔记记录备忘,同时也共享出来,不知道你是否有所收获。接下来会遇到什么样坑。不管怎样,你的每一步,回过头来看,都是值得的。