2014-04-27 15 views
40

Io sono un self-hosting Web API OWIN utilizzando questi frammenti di codice:In OWIN Web API self-hosted, come eseguire il codice all'arresto?

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") 

Vorrei eseguire del codice quando il mio servizio Web API si spegne. Sto cercando qualcosa come HttpApplication.Application_End, un evento Disposed o un ben piazzato override void Dispose().

Come si esegue il codice quando il servizio API Web viene arrestato?

risposta

51

Ciò può essere ottenuto da ottenere la cancellazione del padrone di casa token e la registrazione di un callback con essa in questo modo

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 
      }); 
     } 
    } 
} 

mi è stato detto da qualcuno del team Katana che questa chiave è per funzionalità specifiche di accoglienza e, pertanto, non possono esiste su tutti gli host. Microsoft.Owin.Host.SystemWeb implementa questo, ma non sono sicuro degli altri.

Il modo più semplice per verificare se questo funzionerà per voi è controllare app.Properties per la chiave host.OnAppDisposing.

+0

Ho provato questo e funziona. Grazie! – Wally

+0

@Wally: Sarebbe fantastico se spiegassi come testarlo. – LMK

+0

Per testarlo, eliminare il risultato della chiamata WebApp () e guardare il codice nell'azione token.Register() esecuzione. – mheyman

59

Penso che ci sia un modo migliore per ottenere il CancellationToken:

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

AppProperties è sotto namespace Microsoft.Owin.BuilderProperties, che proviene da questo pacchetto NuGet: http://www.nuget.org/packages/Microsoft.Owin/

La descrizione della proprietà OnAppDisposing dice:

Ottiene o imposta il token di annullamento per "host.OnAppDisposing".

Si prega di fare riferimento a: http://msdn.microsoft.com/en-us/library/microsoft.owin.builderproperties.appproperties%28v=vs.113%29.aspx

+0

Cosa fai con l'istanza di 'properties'? – mikesigs

+0

Puoi buttarlo via, è solo un involucro attorno a 'app.Properties'. – TiMoch

Problemi correlati