Asp.NetCore轻松学-部署到 IIS 进行托管
前言
經(jīng)過一段時(shí)間的學(xué)習(xí),終于來到了部署服務(wù)這個(gè)環(huán)節(jié),.NetCore 的部署方式非常的靈活多樣,但是其萬變不離其宗,所有的 Asp.NetCore 程序都基于端口的偵聽,在部署的時(shí)候僅需要配置偵聽地址、端口(一個(gè)或者多個(gè))即可,在掌握好其托管部署原理后,剩下的就是對(duì)托管宿主的選擇,通過本文,希望可以帶給大家一種清晰的部署思路,選擇最適合自己的服務(wù)部署方式。
1. IIS部署
對(duì)于從傳統(tǒng) .NetFramework 遷移到 .NetCore 的企業(yè)來說,選擇 IIS 方式部署 .NetCore 方式可以最大化的利用現(xiàn)有服務(wù)器資源,同時(shí)還規(guī)避了現(xiàn)有技術(shù)人員對(duì) Linux 不熟悉而引起的各種問題,以達(dá)到平滑過渡的目的。下面我們就來一個(gè)做一個(gè)最簡單的發(fā)布演示
1.1 首先在 IIS 中建立一個(gè)網(wǎng)站 Deploy.IIS
1.2 修改應(yīng)用程序池為:無托管代碼/集成
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 中設(shè)置的演示域名
1.4 發(fā)布程序到 IIS
上面的 IIS 網(wǎng)站已經(jīng)建好了,我們接下來要做的,就是將程序發(fā)布到 IIS 的 物理路徑 C:\Deploy.IIS 文件夾,既然是最簡單的,我們就使用命令 dotnet publish 進(jìn)行發(fā)布,打開項(xiàng)目所在文件夾,在地址欄輸入 cmd 回車,然后出現(xiàn)控制臺(tái)應(yīng)用程序,在控制臺(tái)中輸入命令
dotnet publish -o:c:\Deploy.IIS
1.5 訪問部署好的網(wǎng)站
在瀏覽器中輸入地址:http://www.di.com/
好了,現(xiàn)在已經(jīng)部署成功了。雖然簡單粗暴,但是我們干出來了,為了避免以后會(huì)使用到各種部署姿勢(shì),下面一個(gè)小節(jié)的內(nèi)容你還需要了解一下
2. 需要學(xué)習(xí)的其它內(nèi)容
2.1 IIS 中兩種托管方式
部署到 IIS 的 .NETCore 應(yīng)用程序可以選擇兩種不同的托管模式,分別是“進(jìn)程內(nèi)托管” 和 “進(jìn)程外托管”,選擇哪種托管模式取決于個(gè)人,但是一般推薦使用 “進(jìn)程內(nèi)托管” 模式,使用 “進(jìn)程內(nèi)托管”可依托 IIS 獲得更高的吞吐量,下面來了解一下兩種不同的托管模式的區(qū)別,選擇不同的托管模式可通過修改配置文件 web.config 來完成配置選擇
首先看一個(gè)標(biāo)準(zhǔn)的 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-->
在節(jié)點(diǎn) system.webServer/aspNetCore.hostingModel 中,可以選擇的值為:inprocess(進(jìn)程內(nèi)托管)/outofprocess(進(jìn)程外托管),通過設(shè)置 hostingModel 的值來選擇不同的托管模式
進(jìn)程內(nèi)托管
選擇進(jìn)程內(nèi)托管,意味著將 .NetCore 應(yīng)用程序的工作進(jìn)程托管到 IIS 的工作進(jìn)程 w3wp.exe 中,使用的 IIS 進(jìn)程內(nèi)服務(wù)器,即使用的是:IISHttpServer。
進(jìn)程外托管
選擇進(jìn)程外托管時(shí),web.config 配置節(jié)點(diǎn) system.webServer/aspNetCore.hostingModel 的值必須設(shè)置為:outofprocess,選擇進(jìn)程外托管,實(shí)際上就是告訴 IIS ,當(dāng)前應(yīng)用程序不使用 IISHttpServer,改為使用 Kestrel 服務(wù)器
不同托管模式下代碼的變化
當(dāng)你在 Program.cs 中使用默認(rèn)的代碼創(chuàng)建服務(wù)器的時(shí)候,不管使用的是 inprocess 還是 outofprocess ,代碼是無需改變的,就像下面的代碼,其中,要關(guān)注的代碼是:WebHost.CreateDefaultBuilder(args),表示使用默認(rèn)的構(gòu)建
? ?public class Program
? ?{
? ? ? ?public static void Main(string[] args)
? ? ? ?{
? ? ? ? ? ?CreateWebHostBuilder(args).Build().Run();
? ? ? ?}
? ? ? ?public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
? ? ? ? ? ?WebHost.CreateDefaultBuilder(args)
? ? ? ? ? ? ? ? ? .UseStartup<Startup>();
? ?}
但是,當(dāng)你使用 outofprocess(進(jìn)程外托管模型)時(shí),如果是使用自定義構(gòu)建服務(wù)器時(shí),就必須注意,比如,下面的代碼 new WebHostBuilder().UseKestrel(),這個(gè)時(shí)候,就必須顯式的指定 UseKestrel ;否則,服務(wù)器將無法啟動(dòng),如果使用了 UseKestrel 又想切換到 inprocess(進(jìn)程內(nèi)托管),就必須移除 .UseKestrel(),官網(wǎng)的介紹是在 .UseKestrel() 后面緊跟 .UseIISIntegration(),這樣你就可以愉快的切換來切換去了(但是我測試的結(jié)果是必須移除); 或者,像下面的代碼,使用
.UseKestrel() .UseIIS() .UseIISIntegration()
強(qiáng)烈建議使用 WebHost.CreateDefaultBuilder(args) 的默認(rèn)構(gòu)造,別去踩那么多的坑
? ?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>();
? ? ? ?}
? ?}
結(jié)束語
好了,今天就到這里,為了更靈活的針對(duì)各種部署環(huán)境進(jìn)行發(fā)布預(yù)熱,大家可以通過 dotnet publish -? 來學(xué)習(xí)更多發(fā)布命令的配置吧。
演示代碼下載
https://github.com/lianggx/EasyAspNetCoreDemo/tree/master/Deploy.IIS
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的Asp.NetCore轻松学-部署到 IIS 进行托管的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员修神之路--分布式缓存的一条明路(
- 下一篇: 响应式编程知多少 | Rx.NET 了解