標籤:
本篇將在這個系列示範的例子上繼續記錄Asp.Net Core在Windows上發布的過程。
Asp.Net Core在Windows上可以採用兩種運行方式。一種是自託管運行,另一種是發布到IIS託管運行。
第一部分、自託管一、依賴.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": ["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作為一個反向 Proxy,將請求導向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版本修改為:無Managed 程式碼
啟動網站,訪問地址 http://localhost:8080/api/users ,頁面將顯示內容。
在上面的例子裡,IIS通過Asp.Net Core Module,提供了反向 Proxy的機制。
通過訪問IIS地址,將請求導向Asp.Net Core內建的Kestrel伺服器,經過處理後再反向回傳到IIS。整個過程IIS只作為一個橋樑,不做任何邏輯處理。
最後的話
這個系列到這裡就告一段落了。之所以選擇使用Visual Studio Code工具開發Asp.Net Core Web Api,主要是想通過一點點慢慢搭建這個架構的過程中,逐步學習瞭解Asp.Net Core裡幾個重要的特性和功能,未來在實際開發過程中能更好的選擇合適的技術方案。
使用Visual Studio Code開發Asp.Net Core WebApi學習筆記(十)-- 發布(Windows)