托管ASP.NET Core應(yīng)用到Windows Service中

此文章同時(shí)發(fā)表在本人微信公眾號“dotNET開發(fā)經(jīng)驗(yàn)談”易茬,歡迎右邊二維碼來關(guān)注疫蔓。)
題記:正在構(gòu)思一個(gè)中間件的設(shè)計(jì)腐巢,考慮是否既可以使用最新的技術(shù),也可以兼顧傳統(tǒng)的部署模式腻脏。所以有了這個(gè)問題(包括衍生問題)的提出和解決方法鸦泳。引用博客http://www.cnblogs.com/redmoon/p/6051281.html

托管到Windows Service中

眾所周知,ASP.NET Core采用了和傳統(tǒng)ASP.NET不同的托管和HTTP處理方式永品,即把服務(wù)器和托管環(huán)境完全解耦做鹰。
ASP.NET Core內(nèi)置了兩個(gè)HTTP服務(wù)器實(shí)現(xiàn),一個(gè)是基于libuv實(shí)現(xiàn)的Kestrel(支持跨平臺)鼎姐,一個(gè)是基于Windows HTTP Server API實(shí)現(xiàn)的WebListener(僅支持Windows)钾麸。
而托管環(huán)境可以和服務(wù)器不相關(guān)更振,一般情況是自托管,或者托管到IIS/IISExpress中(此處的IIS僅作為反向代理把請求轉(zhuǎn)發(fā)給所使用的服務(wù)器實(shí)現(xiàn))饭尝。
因此肯腕,打算以Windows Service這種比較傳統(tǒng)的方式來部署ASP.NET Core的Web應(yīng)用也是可行的(本質(zhì)還是自托管,只是啟動進(jìn)程并非控制臺程序钥平,而是一個(gè)Windows Service)实撒。這不,微軟就很貼心的提供了一個(gè)Nuget來支持:Microsoft.AspNetCore.Hosting.WindowsServices涉瘾,它的源碼在:https://github.com/aspnet/Hosting/tree/dev/src/Microsoft.AspNetCore.Hosting.WindowsServices知态。

使用它也很簡單:

  • 創(chuàng)建一個(gè)以.NET Framework為運(yùn)行時(shí)的ASP.NET Core應(yīng)用,即模版選擇“ASP.NET Core Web Application (.NET Framework)”睡汹。
  • 引用Microsoft.AspNetCore.Hosting.WindowsServices肴甸。
  • 在Program的Main方法中寂殉,把默認(rèn)的host.Run改為host.RunAsService囚巴。
  • 編譯程序后,會在Debug目錄下看到你選用的運(yùn)行時(shí)版本的一個(gè)目錄友扰,比如“net46”彤叉,在里面會看到編譯好的exe文件和一個(gè)類似“win7-x64”的這樣文件夾。
    進(jìn)入到“win7-x64”文件夾村怪,在命令行執(zhí)行“sc create MyService binPath = "Full\Path\To\The\Console\file.exe"”秽浇,來創(chuàng)建一個(gè)Windows Service。注意:binPath必須是全路徑甚负。
    這樣就可以在Windows Service中托管ASP.NET Core應(yīng)用了柬焕。
  • 如果希望在服務(wù)啟動和停止的過程中做一些額外處理,比如記錄日志梭域,那么可以實(shí)現(xiàn)一個(gè)CustomWebHostService來繼承WebHostService
    斑举,并在其中編寫所需的代碼。
    并實(shí)現(xiàn)如下的擴(kuò)展方法:
public static class CustomWebHostWindowsServiceExtensions
{ 
  public static void RunAsCustomService(this IWebHost host)
   { 
      var webHostService = new CustomWebHostService(host); 
      ServiceBase.Run(webHostService);
 }
}
host.RunAsCustomService();

把ASP.NET Core應(yīng)用托管到Windows Service中病涨,就這么簡單富玷!
更多問題?
不過既穆,我想從我的場景來談?wù)劄槭裁次矣型泄艿絎indows Service的需求赎懦。這幾天在構(gòu)思一個(gè)中間件(包含多個(gè)組件)的架構(gòu),考慮到初期會以比較傳統(tǒng)的方式來部署幻工,后期有可能跨平臺励两,并且希望組件之間能夠相對獨(dú)立和解耦。所以囊颅,最自然的想法就是架構(gòu)設(shè)計(jì)為微服務(wù)当悔,基于ASP.NET Core實(shí)現(xiàn)(未來不排除使用其他技術(shù)棧)工三。部署的話,初期分離部署為多個(gè)Windows Service先鱼,后期也可以很平滑的過度到容器或者類似Service Fabric這樣的微服務(wù)運(yùn)行平臺中俭正。
基于這樣的設(shè)計(jì)考慮,要解決的第一個(gè)問題就是是否可以把ASP.NET Core應(yīng)用托管到Windows Service中(上面已經(jīng)驗(yàn)證了)焙畔,第二個(gè)問題是是否可以根據(jù)環(huán)境條件跑在不同的啟動進(jìn)程中掸读,第三問題是是否可以同時(shí)支持多種運(yùn)行時(shí)。2宏多,3個(gè)問題要解決其實(shí)也非常簡單儿惫。
支持不同啟動方式
第二個(gè)問題的解決辦法如下:
在Program的Main方法中,判斷一下特定的命令行參數(shù)伸但,比如“--windows-service”
以這個(gè)參數(shù)啟動的情況下肾请,就host.RunAsService,不是的話就host.Run更胖。

就是這么簡單粗暴铛铁。
支持不同運(yùn)行時(shí)
.NET Core本來就支持一個(gè)項(xiàng)目多個(gè)運(yùn)行時(shí),就算把net46和netcoreapp1.0混合也是可以的却妨。具體方法如下:
修改project.json文件饵逐,在frameworks下額外添加“netcoreapp1.0”。
把對Microsoft.AspNetCore.Hosting.WindowsServices的依賴移到net46下
在netcoreapp1.0下添加“Microsoft.NETCore.App”的依賴
在Program的Main方法中彪标,基于條件編譯的符號來判斷不同的運(yùn)行時(shí)倍权,具體的符號表見:https://docs.microsoft.com/en-us/dotnet/articles/core/tutorials/libraries#how-to-multitarget

示例源代碼
為了避免在文章中貼大段的源代碼,大家轉(zhuǎn)到GitHub中去看示例代碼吧:https://github.com/heavenwing/HostingAspCoreAsWindowsService

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捞烟,一起剝皮案震驚了整個(gè)濱河市薄声,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌题画,老刑警劉巖默辨,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異婴程,居然都是意外死亡廓奕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門档叔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桌粉,“玉大人,你說我怎么就攤上這事衙四×蹇希” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵传蹈,是天一觀的道長押逼。 經(jīng)常有香客問我步藕,道長,這世上最難降的妖魔是什么挑格? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任咙冗,我火速辦了婚禮,結(jié)果婚禮上漂彤,老公的妹妹穿的比我還像新娘雾消。我一直安慰自己,他們只是感情好挫望,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布立润。 她就那樣靜靜地躺著,像睡著了一般媳板。 火紅的嫁衣襯著肌膚如雪桑腮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天蛉幸,我揣著相機(jī)與錄音破讨,去河邊找鬼。 笑死巨缘,一個(gè)胖子當(dāng)著我的面吹牛添忘,可吹牛的內(nèi)容都是我干的采呐。 我是一名探鬼主播若锁,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼斧吐!你這毒婦竟也來了又固?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤煤率,失蹤者是張志新(化名)和其女友劉穎仰冠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝶糯,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洋只,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昼捍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片识虚。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖妒茬,靈堂內(nèi)的尸體忽然破棺而出担锤,到底是詐尸還是另有隱情,我是刑警寧澤乍钻,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布肛循,位于F島的核電站铭腕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏多糠。R本人自食惡果不足惜累舷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夹孔。 院中可真熱鬧笋粟,春花似錦、人聲如沸析蝴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闷畸。三九已至尝盼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佑菩,已是汗流浹背盾沫。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留殿漠,地道東北人赴精。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像绞幌,于是被迫代替她去往敵國和親蕾哟。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容