前言:
当构建一个 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
在控制面板→程序→启用或关闭 Windows 功能→勾选 Internet Information Services 以及 Web 管理工具下的 IIS 管理控制台
二, 发布项目
发布我们建好的 ASP.NET Core 项目, 然后选择 IIS, 新建一项发布配置
三, 在 IIS 上绑定添加网站
添加一个网站, 设置一下名称, 并将路径指向你刚才发布的文件夹, 然后启动网站即可
设置应用程序池的. NET CLR 版本为 "无托管代码", 因为刚才也说了, IIS 是作为一个反向代理的角色, 并不需要它来托管代码
四, 浏览网站
这个时候出现了这个问题
错误分析:
IIS 服务器上的. net core 运行时不是最新的, 导致 AspNetCoreModuleV2 模块缺失或者报错
检查发现 项目的版本是 .netcore2.2 , 而运行时安装的为 .netcore runtime 2.1.6
查看程序 如果没有安装. netcore2.2 就需要安装
下载完成后安装
就可以打开网站了
总结:
至此, 整个 IIS 的搭建已经完成, 作为个人的笔记记录备忘, 同时也共享出来, 不知道你是否有所收获. 接下来会遇到什么样坑. 不管怎样, 你的每一步, 回过头来看, 都是值得的
来源: http://www.bubuko.com/infodetail-3085396.html