(此文章同時發表在本人微信公衆號「dotNET開發經驗談」,歡迎右邊二維碼來關注。)git
題記:正在構思一箇中間件的設計,考慮是否既可使用最新的技術,也能夠兼顧傳統的部署模式。因此有了這個問題(包括衍生問題)的提出和解決方法。github
衆所周知,ASP.NET Core採用了和傳統ASP.NET不一樣的託管和HTTP處理方式,即把服務器和託管環境徹底解耦。web
ASP.NET Core內置了兩個HTTP服務器實現,一個是基於libuv實現的Kestrel(支持跨平臺),一個是基於Windows HTTP Server API實現的WebListener(僅支持Windows)。json
而託管環境能夠和服務器不相關,通常狀況是自託管,或者託管到IIS/IISExpress中(此處的IIS僅做爲反向代理把請求轉發給所使用的服務器實現)。windows
所以,打算以Windows Service這種比較傳統的方式來部署ASP.NET Core的Web應用也是可行的(本質仍是自託管,只是啓動進程並不是控制檯程序,而是一個Windows Service)。這不,微軟就很貼心的提供了一個Nuget來支持:Microsoft.AspNetCore.Hosting.WindowsServices,它的源碼在:https://github.com/aspnet/Hosting/tree/dev/src/Microsoft.AspNetCore.Hosting.WindowsServices。服務器
使用它也很簡單:微信
WebHostService
,並在其中編寫所需的代碼。public static class CustomWebHostWindowsServiceExtensions { public static void RunAsCustomService(this IWebHost host) { var webHostService = new CustomWebHostService(host); ServiceBase.Run(webHostService); } } host.RunAsCustomService();
把ASP.NET Core應用託管到Windows Service中,就這麼簡單!架構
不過,我想從個人場景來談談爲何我有託管到Windows Service的需求。這幾天在構思一箇中間件(包含多個組件)的架構,考慮到初期會以比較傳統的方式來部署,後期有可能跨平臺,而且但願組件之間可以相對獨立和解耦。因此,最天然的想法就是架構設計爲微服務,基於ASP.NET Core實現(將來不排除使用其餘技術棧)。部署的話,初期分離部署爲多個Windows Service,後期也能夠很平滑的過分到容器或者相似Service Fabric這樣的微服務運行平臺中。app
基於這樣的設計考慮,要解決的第一個問題就是是否能夠把ASP.NET Core應用託管到Windows Service中(上面已經驗證了),第二個問題是是否能夠根據環境條件跑在不一樣的啓動進程中,第三問題是是否能夠同時支持多種運行時。2,3個問題要解決其實也很是簡單。微服務
第二個問題的解決辦法以下:
就是這麼簡單粗暴。
.NET Core原本就支持一個項目多個運行時,就算把net46和netcoreapp1.0混合也是能夠的。具體方法以下:
爲了不在文章中貼大段的源代碼,你們轉到GitHub中去看示例代碼吧:https://github.com/heavenwing/HostingAspCoreAsWindowsService