通过一段时间的学习,终于来到了部署服务这个环节,.NetCore 的部署方式很是的灵活多样,可是其万变不离其宗,全部的 Asp.NetCore 程序都基于端口的侦听,在部署的时候仅须要配置侦听地址、端口(一个或者多个)便可,在掌握好其托管部署原理后,剩下的就是对托管宿主的选择,经过本文,但愿能够带给你们一种清晰的部署思路,选择最适合本身的服务部署方式。git
对于从传统 .NetFramework 迁移到 .NetCore 的企业来讲,选择 IIS 方式部署 .NetCore 方式能够最大化的利用现有服务器资源,同时还规避了现有技术人员对 Linux 不熟悉而引发的各类问题,以达到平滑过渡的目的。下面咱们就来一个作一个最简单的发布演示github
修改 C:\Windows\System32\drivers\etc\hosts 文件映射若是下web
# localhost name resolution is handled within DNS itself. # 127.0.0.1 localhost # ::1 localhost 172.16.10.227 www.di.com # 这里的域名就是在 IIS 中设置的演示域名
上面的 IIS 网站已经建好了,咱们接下来要作的,就是将程序发布到 IIS 的 物理路径 C:\Deploy.IIS 文件夹,既然是最简单的,咱们就使用命令 dotnet publish 进行发布,打开项目所在文件夹,在地址栏输入 cmd 回车,而后出现控制台应用程序,在控制台中输入命令浏览器
dotnet publish -o:c:\Deploy.IIS
在浏览器中输入地址:http://www.di.com/服务器
部署到 IIS 的 .NETCore 应用程序能够选择两种不一样的托管模式,分别是“进程内托管” 和 “进程外托管”,选择哪一种托管模式取决于我的,可是通常推荐使用 “进程内托管” 模式,使用 “进程内托管”可依托 IIS 得到更高的吞吐量,下面来了解一下两种不一样的托管模式的区别,选择不一样的托管模式可经过修改配置文件 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。ui
选择进程外托管时,web.config 配置节点 system.webServer/aspNetCore.hostingModel 的值必须设置为:outofprocess,选择进程外托管,实际上就是告诉 IIS ,当前应用程序不使用 IISHttpServer,改成使用 Kestrel 服务器code
当你在 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()
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