.net core 应用部署问题解决手册
net core 应用,是微软公司近年来为顺应跨平台、服务微化集群化部署的潮流而推出的全新 WEB 服务开发模式。上图中的dotnet-sdk-6.0.200-win-x64.exe这个运行时环境对标的是 JAVA 解决方案中的Java 虚拟机运行环境上图中的dotnet-hosting-2.2.4-win.exe。
- 一、部署方式及基础原理
.net core 应用,是微软公司近年来为顺应跨平台、服务微化集群化部署的潮流而推出的全新 WEB 服务开发模式。
.net core 应用能正常跑的前提包括:
- 安装一个runtime 运行时环境(上图中的dotnet-sdk-6.0.200-win-x64.exe),这个运行时环境对标的是 JAVA 解决方案中的Java 虚拟机运行环境;.net core 应用将不再由 IIS 内部的 framework 来负责解析逻辑,改由这个runtime 运行时环境完成逻辑的解析。
- 部署:.net core 应用可以跨平台,因此可以脱离 IIS 独立跑。但是在windows平台上,仍然可以在大家非常熟悉的 IIS 上部署和管理。
- 在 IIS 上部署时,需要给 IIS安装一个插件(上图中的dotnet-hosting-2.2.4-win.exe)。有了这个插件,IIS 就可以不去解析 .net core 应用的请求,而只是将请求转发给运行时环境,并等候返回再转发给client端。也就是说,IIS 在处理.net core应用的请求时,只是一个转发代理而已。
-
二、部署过程
下面详细描述我安装部署“admin管理端应用”过程中遇到的问题,以及解决问题的过程,供大家以后参考。
- 拿到安装包,到 IIS 上去部署
拿到安装包后,发现跟以往正常的.NET应用包非常不同,目录文件长相如下图:
熟悉的只有上图中标记红框的两个配置文件。
2. 打开看看 web.config 文件
先看看 .net core 下的web.config 配置文件是什么样的,有什么配置项。
<?xml version="1.0" encoding="utf-8"?> <configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\Manage.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" /> </system.webServer> </location> </configuration> <!--ProjectGuid: 89bc8b38-1dc7-49ee-9649-239fb2521ef8--> |
从配置文件中可以看出,IIS 对这个应用采用AspNetCoreModuleV2 来处理,而处理方式是用相应目录下的Manage.dll来完成解析。
3. 打开看看 appsettings.json 文件
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { "DefaultConnection": "data source=192.168.5.42;initial catalog=aidata_sm;persist security info=true;user id=xxx;password=yyyy;Connect Timeout=600000;Trusted_Connection=false", "IsNotWriteDB": "true", "DefaultConnectionForMySql": "Data Source = 192.168.5.42; Initial Catalog = aidata_sm; User Id = xxx; Password =yyyy" } } |
看到这里配置了如何获取数据库连接。(找到了一点点普通的 framework应用配置的感觉)
4. 安装runtime运行时环境
双击执行安装包 dotnet-sdk-6.0.200-win-x64.exe 。(微软官网上下载即可)
首次安装直接执行即可,也没有什么需要配置的内容。
装过的话,再次打开会如下图,允许修复或卸载。
验证已经正常安装好runtime运行时环境的方式为:
Cmd 窗口中键入命令:dotnet --info
5. 像传统framework应用一样去IIS部署
部署看上去没啥异常,于是去尝试浏览。
报错HTTP 错误 500.19 - Internal Server Error
无法访问请求的页面,因为该页的相关配置数据无效。
具体的错误代码是:0x8007000d
看上去好像配置文件 web.config 有问题。于是点击蓝色的链接“查看更多信息”去看具体的错误代码是:0x8007000d对应的错误提示,提示说可能是因为部署的目录没有给授权,所以应用无法访问web.config文件。
赶紧百度一下,给目录授权:
再次尝试访问:http://192.168.23.10:10001/
还是一样的报错,错误号还是一样的:0x8007000d
咨询同事,同事说需要在应用程序池中将该应用设置成:无托管代码。于是照办。
重启应用,再次尝试访问:http://192.168.23.10:10001/
还是一样的报错,错误号还是一样的:0x8007000d
6. 安装IIS插件模块AspNetCoreModule,在 IIS 与.net core运行时环境之间搭建桥梁
经过如上的尝试后,感觉IIS中少了点什么,因为我们从IIS 中完全看不到已经安装过runtime运行时环境的痕迹。
相信遇到过此问题的IT人一定不止我一个,赶紧去百度。找到这样一篇文章:新装的服务器发布iis网站后提示500.19错误代码:0x8007000d问题的解决过程(新装的服务器发布iis网站后提示500.19错误代码:0x8007000d问题的解决过程_iis0x8007000d-CSDN博客)。感谢喜欢分享、热心而且自信的IT同行们,这个特点是我作为IT人最引以为傲的。
文章一针见血地指出,我的 IIS 缺少了两个模块:AspNetCoreModule,AspNetCoreModuleV2。
看全文章要付费,但是有了上述提示,就可以继续去百度如何安装如上两个模块。
在IIS上部署ASP.NET Core项目的图文方法 - 经验笔记 (nhooo.com)
下载的链接为微软官方:https://go.microsoft.com/fwlink/?linkid=844461
下载后文件为:dotnet-hosting-2.2.4-win.exe
安装此文件,终于在 IIS 中找到这两个模块:
再次尝试访问应用:http://192.168.23.10:10001/
终于看到登录页面。
7. 总结一下
1)安装runtime运行时环境:dotnet-sdk-6.0.200-win-x64.exe。
验证已经正常安装好runtime运行时环境的方式为:
Cmd 窗口中键入命令:dotnet --info
2)为IIS 安装AspNetCoreModule,AspNetCoreModuleV2两个模块:dotnet-hosting-2.2.4-win.exe
验证方式:IIS 中看到了两个模块
3) 正常到 IIS 上部署应用,并确保应用目录是everyone可读写的;
4) 设置新部署的应用程序池为“无托管代码”;(这一步似乎不关键)
5) 数据库连接字符串配置在文件 appsettings.json 中。
更多推荐
所有评论(0)