在自托管的OWIN Web API中,如何在关机时运行代码?

Wal*_*lly 41 c# asp.net-web-api owin

我使用这些代码片段自我托管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")
Run Code Online (Sandbox Code Playgroud)

我想在我的Web API服务关闭时运行一些代码.我正在寻找类似的东西HttpApplication.Application_End,一个Disposed活动,或者一个很好的位置override void Dispose().

如何在Web API服务关闭时运行代码?

小智 64

我认为有更好的方法来获得CancellationToken:

var properties = new AppProperties(app.Properties);
CancellationToken token = properties.OnAppDisposing;
Run Code Online (Sandbox Code Playgroud)

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


Bri*_*iec 56

这可以通过获取主机的取消令牌并像这样注册回调来实现

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
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Katana团队的某个人告诉我,此密钥用于特定于主机的功能,因此可能不存在于所有主机上.Microsoft.Owin.Host.SystemWeb确实实现了这一点,但我不确定其他人.

验证这是否会为你工作最简单的方法是检查app.Propertieshost.OnAppDisposing重点.

  • `if(token!= CancellationToken.None)`有点多余,CancellationToken.None.Register(action)执行检查并为不可取消的令牌返回空的CancellationTokenRegistration().你可以做一个单行:`new AppProperties(app.Properties).OnAppDisposing.Register(()=> {/*stuff*/});` (5认同)