NetCore Selfhost,IIShost,Windows Service Host详解(自宿主、宿主在IIS,宿主在Windows Service中)
第一部分、自托管
一、依赖.Net Core环境
修改 project.json 文件内容,增加发布时需要包含文件的配置内容(NetCore2.0版本不需要任何设置,NetCore2.0开始彻底放弃project.json,全面改回.csproj,详见难以接受你的改变:从project.json到.csproj)
1 { 2 "version": "1.0.0-*", 3 "testRunner": "xunit", // 设置测试工具为xunit 4 "buildOptions": { 5 "debugType": "portable", 6 "emitEntryPoint": true 7 }, 8 "dependencies": { 9 "Microsoft.NETCore.App": { 10 "type": "platform", 11 "version": "1.0.0" 12 }, 13 "Microsoft.AspNetCore.Server.Kestrel": "1.0.0", 14 "Microsoft.AspNetCore.Mvc": "1.0.0", 15 "Microsoft.Extensions.Logging": "1.0.0", 16 "Microsoft.Extensions.Logging.Console": "1.0.0", 17 "Microsoft.Extensions.Logging.Debug": "1.0.0", 18 "Microsoft.Extensions.Logging.Filter": "1.0.0", 19 "NLog.Extensions.Logging": "1.0.0-rtm-alpha2", 20 "Autofac.Extensions.DependencyInjection": "4.0.0-rc3-309", 21 "Microsoft.Extensions.Configuration": "1.0.0", 22 "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0", 23 "Microsoft.Extensions.Configuration.Json": "1.0.0", 24 "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0", 25 "xunit": "2.2.0-beta2-build3300", 26 "dotnet-test-xunit": "2.2.0-preview2-build1029", 27 "moq.netcore": "4.4.0-beta8", 28 "Microsoft.AspNetCore.TestHost": "1.0.0", 29 "Newtonsoft.Json": "9.0.1" 30 }, 31 "frameworks": { 32 "netcoreapp1.0": { 33 // 设置兼容框架 34 "imports": [ 35 "dotnet54", 36 "portable-net45+win8" 37 ] 38 } 39 }, 40 "publishOptions": { 41 // 设置发布时需要包含的文件 42 "includeFiles": ["appsettings.json", "nlog.config"] 43 } 44 }
打开cmd窗口,进入到项目根目录,输入命令 dotnet publish ,项目将会进行编译发布
输入 dotnet xxx.dll 命令启动程序
访问路径 http://localhost:5000/api/users ,页面正常显示。
二、自带运行时发布
在跨平台发布时,.Net Core可以通过配置的方式指定目标平台,在发布时将对应的运行时一并打包发布。这样目标平台不需要安装.Net Core环境就可以部署。
再次修改 project.json 文件,增加目标平台
1 { 2 "version": "1.0.0-*", 3 "testRunner": "xunit", // 设置测试工具为xunit 4 "buildOptions": { 5 "debugType": "portable", 6 "emitEntryPoint": true 7 }, 8 "dependencies": { 9 "Microsoft.NETCore.App": { 10 //"type": "platform", // 这个需要注释掉 11 "version": "1.0.0" 12 }, 13 "Microsoft.AspNetCore.Server.Kestrel": "1.0.0", 14 "Microsoft.AspNetCore.Mvc": "1.0.0", 15 "Microsoft.Extensions.Logging": "1.0.0", 16 "Microsoft.Extensions.Logging.Console": "1.0.0", 17 "Microsoft.Extensions.Logging.Debug": "1.0.0", 18 "Microsoft.Extensions.Logging.Filter": "1.0.0", 19 "NLog.Extensions.Logging": "1.0.0-rtm-alpha2", 20 "Autofac.Extensions.DependencyInjection": "4.0.0-rc3-309", 21 "Microsoft.Extensions.Configuration": "1.0.0", 22 "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0", 23 "Microsoft.Extensions.Configuration.Json": "1.0.0", 24 "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0", 25 "xunit": "2.2.0-beta2-build3300", 26 "dotnet-test-xunit": "2.2.0-preview2-build1029", 27 "moq.netcore": "4.4.0-beta8", 28 "Microsoft.AspNetCore.TestHost": "1.0.0", 29 "Newtonsoft.Json": "9.0.1" 30 }, 31 "frameworks": { 32 "netcoreapp1.0": { 33 // 设置兼容框架 34 "imports": [ 35 "dotnet54", 36 "portable-net45+win8" 37 ] 38 } 39 }, 40 "publishOptions": { 41 // 设置发布时需要包含的文件 42 "includeFiles": [ 43 "appsettings.json", 44 "nlog.config" 45 ] 46 }, 47 // 目标平台 48 "runtimes": { 49 "win7-x64": {}, 50 "win10-x64": {}, 51 "ubuntu.14.04-x64": {} 52 } 53 }
cmd窗口运行 dotnet restore 命令,还原目标平台相关的包。这个过程耗时较长。
还原完成后,执行 dotnet publish 命令进行发布
进入对应发布目录,执行 WebApiFrame.exe 文件即可启动项目。
如果不显式指定目标平台,.Net Core默认选择当前系统平台。如果想指定目标平台,则需要执行命令 dotnet publish -r {目标平台} 。下面展示的是发布到ubuntu环境下。
第二部分、IIS托管
首先要安装一个工具.NET Core Windows Server Hosting。该工具支持将IIS作为一个反向代理,将请求导向Kestrel服务器。
引入相关nuget包
"Microsoft.AspNetCore.Server.IISIntegration": "1.0.0"
修改 Program.cs 内容
1 using Microsoft.AspNetCore.Hosting; 2 3 namespace WebApiFrame 4 { 5 public class Program 6 { 7 public static void Main(string[] args) 8 { 9 var host = new WebHostBuilder() 10 .UseKestrel() 11 .UseIISIntegration() 12 .UseStartup<Startup>() 13 .Build(); 14 15 host.Run(); 16 } 17 } 18 }
在项目根目录添加web.config,并配置到发布包含文件列表中
1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 4 <!-- 5 Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380 6 --> 7 8 <system.webServer> 9 <handlers> 10 <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/> 11 </handlers> 12 <aspNetCore processPath="dotnet" arguments=".\WebApiFrame.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" /> 13 </system.webServer> 14 </configuration>
执行 dotnet publish 发布后开始配置IIS
修改应用程序池,.Net CLR版本修改为:无托管代码
启动网站,访问地址 http://localhost:8080/api/users ,页面将显示内容。
在上面的例子里,IIS通过Asp.Net Core Module,提供了反向代理的机制。
通过访问IIS地址,将请求导向Asp.Net Core内置的Kestrel服务器,经过处理后再反向回传到IIS。整个过程IIS只作为一个桥梁,不做任何逻辑处理。
第二部分、托管在Windows Service中
阿里云: www.aliyun.com
华赐软件: www.huacisoft.com
C#开源社区: www.opencsharp.net
清泓美肤苑: 清泓美肤苑
bootstrap权限管理系统: Asp.Net Mvc3 bootstrap权限管理系统