• 一、部署方式及基础原理

.net core 应用,是微软公司近年来为顺应跨平台、服务微化集群化部署的潮流而推出的全新 WEB 服务开发模式。

.net core 应用能正常跑的前提包括:

  1. 安装一个runtime 运行时环境(上图中的dotnet-sdk-6.0.200-win-x64.exe),这个运行时环境对标的是 JAVA 解决方案中的Java 虚拟机运行环境;.net core 应用将不再由 IIS 内部的 framework 来负责解析逻辑,改由这个runtime 运行时环境完成逻辑的解析。
  2. 部署:.net core 应用可以跨平台,因此可以脱离 IIS 独立跑。但是在windows平台上,仍然可以在大家非常熟悉的 IIS 上部署和管理。
  3. 在 IIS 上部署时,需要给 IIS安装一个插件(上图中的dotnet-hosting-2.2.4-win.exe)。有了这个插件,IIS 就可以不去解析 .net core 应用的请求,而只是将请求转发给运行时环境,并等候返回再转发给client端。也就是说,IIS 在处理.net core应用的请求时,只是一个转发代理而已。

  • 二、部署过程

下面详细描述我安装部署“admin管理端应用”过程中遇到的问题,以及解决问题的过程,供大家以后参考。

  1. 拿到安装包,到 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 中。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐