2014-04-27 106 views
40

我自託管使用這些代碼片段OWIN的Web API:在自主託管的OWIN Web API中,如何在關閉時運行代碼?

class Startup 
{ 
    public void Configuration(IAppBuilder appBuilder) 
    { 
     var config = new HttpConfiguration(); 
     var route = config.Routes.MapHttpRoute("DefaultApi", "{controller}"); 
     appBuilder.UseWebApi(config); 
    } 
} 

WebApp.Start<Startup>("http://localhost:8080") 

我想,當我的Web API服務關閉時運行一些代碼。我正在尋找類似HttpApplication.Application_EndDisposed事件或位置良好的override void Dispose()

如何在Web API服務關閉時運行代碼?

回答

51

這可以通過讓主機的取消令牌,並用它註冊一個回調像這樣

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var context = new OwinContext(app.Properties); 
     var token = context.Get<CancellationToken>("host.OnAppDisposing"); 
     if (token != CancellationToken.None) 
     { 
      token.Register(() => 
      { 
       // code to run 
      }); 
     } 
    } 
} 

有人告訴我,有人在武士隊,這關鍵是主機特定的功能來實現,因此不能存在於所有主機上。 Microsoft.Owin.Host.SystemWeb確實實現了這一點,但我不確定其他人。

驗證此功能是否適用於您的最簡單方法是檢查app.Properties以獲取host.OnAppDisposing密鑰。

+0

我測試了這個,它的工作原理。謝謝! – Wally

+0

@Wally:如果你解釋如何測試它會很好。 – LMK

+0

要測試它,處置WebApp ()調用的結果並在token.Register()中執行代碼。 – mheyman

59

我認爲這是一個更好的方式來獲得CancellationToken

var properties = new AppProperties(app.Properties); 
CancellationToken token = properties.OnAppDisposing; 

AppProperties正在命名空間Microsoft.Owin.BuilderProperties,它來源於此NuGet包:http://www.nuget.org/packages/Microsoft.Owin/

財產OnAppDisposing描述說:

獲取或設置「host.OnAppDisposing」的取消標記。

請參考:http://msdn.microsoft.com/en-us/library/microsoft.owin.builderproperties.appproperties%28v=vs.113%29.aspx

+0

你對「屬性」的實例做了什麼? – mikesigs

+0

你可以把它扔掉,它只是'app.Properties'的一個包裝。 – TiMoch

相關問題