NetCore Selfhost,IIShost,Windows Service Host詳解(自宿主、宿主在IIS,宿主在Windows Service中)

第一部分、自託管

1、依賴.Net Core環境

修改 project.json 文件內容,增長髮布時須要包含文件的配置內容(NetCore2.0版本不須要任何設置,NetCore2.0開始完全放棄project.json,全面改回.csproj,詳見難以接受你的改變:從project.json到.csprojhtml

複製代碼
 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 ,項目將會進行編譯發佈web

 

輸入 dotnet xxx.dll 命令啓動程序json

訪問路徑 http://localhost:5000/api/users ,頁面正常顯示。ubuntu

2、自帶運行時發佈

在跨平臺發佈時,.Net Core能夠經過配置的方式指定目標平臺,在發佈時將對應的運行時一併打包發佈。這樣目標平臺不須要安裝.Net Core環境就能夠部署。api

再次修改 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 命令,還原目標平臺相關的包。這個過程耗時較長。app

還原完成後,執行 dotnet publish 命令進行發佈框架

進入對應發佈目錄,執行 WebApiFrame.exe 文件便可啓動項目。工具

若是不顯式指定目標平臺,.Net Core默認選擇當前系統平臺。若是想指定目標平臺,則須要執行命令 dotnet publish -r {目標平臺} 。下面展現的是發佈到ubuntu環境下。post

 

第二部分、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中

詳見這裏:ASP.NET Core應用到Windows Service中

相關文章
相關標籤/搜索