Asp.NetCore轻松学-部署到 IIS 进行托管
前言
经过一段时间的学习,终于来到了部署服务这个环节,.netcore 的部署方式非常的灵活多样,但是其万变不离其宗,所有的 asp.netcore 程序都基于端口的侦听,在部署的时候仅需要配置侦听地址、端口(一个或者多个)即可,在掌握好其托管部署原理后,剩下的就是对托管宿主的选择,通过本文,希望可以带给大家一种清晰的部署思路,选择最适合自己的服务部署方式。
1. iis部署
对于从传统 .netframework 迁移到 .netcore 的企业来说,选择 iis 方式部署 .netcore 方式可以最大化的利用现有服务器资源,同时还规避了现有技术人员对 linux 不熟悉而引起的各种问题,以达到平滑过渡的目的。下面我们就来一个做一个最简单的发布演示
1.1 首先在 iis 中建立一个网站 deploy.iis
1.2 修改应用程序池为:无托管代码/集成
1.3 映射演示域名
修改 c:\windows\system32\drivers\etc\hosts 文件映射如果下
# localhost name resolution is handled within dns itself. # 127.0.0.1 localhost # ::1 localhost 172.16.10.227 www.di.com # 这里的域名就是在 iis 中设置的演示域名
1.4 发布程序到 iis
上面的 iis 网站已经建好了,我们接下来要做的,就是将程序发布到 iis 的 物理路径 c:\deploy.iis 文件夹,既然是最简单的,我们就使用命令 dotnet publish 进行发布,打开项目所在文件夹,在地址栏输入 cmd 回车,然后出现控制台应用程序,在控制台中输入命令
dotnet publish -o:c:\deploy.iis
1.5 访问部署好的网站
在浏览器中输入地址:
- 好了,现在已经部署成功了。虽然简单粗暴,但是我们干出来了,为了避免以后会使用到各种部署姿势,下面一个小节的内容你还需要了解一下
2. 需要学习的其它内容
2.1 iis 中两种托管方式
部署到 iis 的 .netcore 应用程序可以选择两种不同的托管模式,分别是“进程内托管” 和 “进程外托管”,选择哪种托管模式取决于个人,但是一般推荐使用 “进程内托管” 模式,使用 “进程内托管”可依托 iis 获得更高的吞吐量,下面来了解一下两种不同的托管模式的区别,选择不同的托管模式可通过修改配置文件 web.config 来完成配置选择
- 首先看一个标准的 asp.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=".\deploy.iis.dll" stdoutlogenabled="false" stdoutlogfile=".\logs\stdout" hostingmodel="outofprocess" /> </system.webserver> </location> </configuration> <!--projectguid: ea8ea1cd-a655-48c6-ad48-1cca646c2db7-->
在节点 system.webserver/aspnetcore.hostingmodel 中,可以选择的值为:inprocess(进程内托管)/outofprocess(进程外托管),通过设置 hostingmodel 的值来选择不同的托管模式
进程内托管
选择进程内托管,意味着将 .netcore 应用程序的工作进程托管到 iis 的工作进程 w3wp.exe 中,使用的 iis 进程内服务器,即使用的是:iishttpserver。
- 进程外托管
选择进程外托管时,web.config 配置节点 system.webserver/aspnetcore.hostingmodel 的值必须设置为:outofprocess,选择进程外托管,实际上就是告诉 iis ,当前应用程序不使用 iishttpserver,改为使用 kestrel 服务器
- 不同托管模式下代码的变化
当你在 program.cs 中使用默认的代码创建服务器的时候,不管使用的是 inprocess 还是 outofprocess ,代码是无需改变的,就像下面的代码,其中,要关注的代码是:webhost.createdefaultbuilder(args),表示使用默认的构建
public class program { public static void main(string[] args) { createwebhostbuilder(args).build().run(); } public static iwebhostbuilder createwebhostbuilder(string[] args) => webhost.createdefaultbuilder(args) .usestartup<startup>(); }
但是,当你使用 outofprocess(进程外托管模型)时,如果是使用自定义构建服务器时,就必须注意,比如,下面的代码 new webhostbuilder().usekestrel(),这个时候,就必须显式的指定 usekestrel ;否则,服务器将无法启动,如果使用了 usekestrel 又想切换到 inprocess(进程内托管),就必须移除 .usekestrel(),官网的介绍是在 .usekestrel() 后面紧跟 .useiisintegration(),这样你就可以愉快的切换来切换去了(但是我测试的结果是必须移除);
或者,像下面的代码,使用
.usekestrel()
.useiis()
.useiisintegration()
- 强烈建议使用 webhost.createdefaultbuilder(args) 的默认构造,别去踩那么多的坑
public class program { public static void main(string[] args) { createwebhostbuilder(args).build().run(); } public static iwebhostbuilder createwebhostbuilder(string[] args) { return new webhostbuilder() .usekestrel() .useiis() .useiisintegration() .usestartup<startup>(); } }
结束语
好了,今天就到这里,为了更灵活的针对各种部署环境进行发布预热,大家可以通过 dotnet publish -? 来学习更多发布命令的配置
演示代码下载
https://github.com/lianggx/easyaspnetcoredemo/tree/master/deploy.iis
下一篇: 记一次灰产创业史