天天看點

如何遠端關閉一個ASP.NET Core應用?一、ApplicationLifetime二、WebHost的Run方法三、遠端關閉應用

目錄 一、ApplicationLifetime 二、WebHost的Run方法 三、遠端關閉應用

從命名的角度來看,ApplicationLifetime貌似是對目前應用生命周期的描述,而實際上它存在的目的僅僅是在應用啟動和關閉時對相關元件發送相應的信号或者通知而已。如下面的代碼片段所示,IApplicationLifetime接口具有三個CancellationToken類型的屬性(ApplicationStarted、ApplicationStopping和ApplicationStopped),如果需要在應用自動和終止前後執行某種操作,我們可以注冊相應的回調在這三個CancellationToken對象上。除了這三個類型為CancellationToken的屬性,IApplicationLifetime接口還定義了一個StopApplication方法,我們可以調用這個方法發送關閉應用的信号,并最終真正地關閉應用。

ASP.NET

Core預設使用的ApplicationLifetime是具有如下定義的一個同名類型。可以看出它實作的三個屬性傳回的CancellationToken對象是通過三個對應的CancellationTokenSource生成。除了實作IApplicationLifetime接口的StopApplication方法用于發送“正在關閉”通知之外,這個類型還定義了額外兩個方法(NotifyStarted和NotifyStopped)用于發送“已經開啟/關閉”的通知。

當WebHost因Start方法的執行而被開啟的時候,它最終會調用ApplicationLifetime的NotifyStarted方法對外發送應用被成功啟動的信号。不知道讀者朋友們又被注意到,WebHost僅僅定義了啟動應用的Start方法,并不曾定義終止應用的Stop或者Close方法,它僅僅在Dispose方法中調用了ApplicationLifetime的StopApplication方法。

我們知道啟動應用最終是通過調用作為宿主的WebHost的Start方法來完成的,但是我們之前示範的所有執行個體都不曾顯式地調用過這個方法,我們調用的是它的擴充方法Run。毫無疑問,WebHost的Run方法肯定會調用Start方法來開啟WebHost,但是除此之外,這個Run方法還有何特别之處呢?

Run方法的目的除了啟動WebHost之外,它實際上會阻塞目前程序直到應用關閉。我們知道應用的關閉的意圖是通過利用ApplicationLifetime發送相應信号的方式實作的,是以這個Run方法在啟動WebHost的時候,會以阻塞目前線程的方式等待直至接收到這個信号。如下所示的代碼片段基本上展現了這兩個擴充方法Run的實作邏輯。

上面這個代碼片段還展現了另一個細節。雖然WebHost實作了IDisposable接口,原則上我們需要在關閉的時候顯式地調用其Dispose方法。針對這個方法的調用非常重要,因為它的ServiceProvider隻能在這個方法被調用時才能被回收釋放。但是之前所有示範的執行個體都沒有這麼做,因為Run方法會自動幫助回收釋放掉指定的這個WebHost。

既然WebHost在啟動之後會利用ApplicationLifetime等待Stopping信号的發送,這就意味着組成ASP.NET

接下來我們通過執行個體的方式來示範如何在一個中間件中利用這個ApplicationLifetime對象實作對應用的遠端關閉,為此我們将這個中間件命名為RemoteStopMiddleware。RemoteStopMiddleware實作遠端關閉應用的原理很簡單,我們遠端發送一個Head請求,并且在該請求中添加一個名為“Stop-Application”的報頭傳到希望關閉應用的意圖,該中間件接收到這個請求之後會關閉應用,而響應中會添加一個“Application-Stopped”報頭表明應用已經被關閉。

如上所示的代碼片段是RemoteStopMiddleware這個中間件的完整定義,實作邏輯很簡單,完全沒有必要再贅言解釋。我們在一個控制台應用中采用如下的程式啟動一個Hello

World應用,并注冊此RemoteStopMiddleware中間件。在啟動這個應用之後,我們借助Fiddler發送向目标位址發送三次請求,其中第一次和第三次普通的GET請求,而第二次則是為了遠端關閉應用的HEAD請求。如下所示的是三次請求與響應的内容,由于應用被第二次請求關閉,是以第三次請求會傳回一個狀态碼為502的響應。

作者:蔣金楠

微信公衆賬号:大内老A

如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識别二維碼)關注個人公衆号(原來公衆帳号蔣金楠的自媒體将會停用)。

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

<a href="http://www.cnblogs.com/artech/p/application-life-time.html" target="_blank">原文連結</a>

繼續閱讀