繁体   English   中英

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

[英]In self-hosted OWIN Web API, how to run code at shutdown?

我使用以下代码片段自托管 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服务关闭时如何运行代码?

我认为有更好的方法来获取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

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

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

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

验证这是否适合您的最简单方法是检查app.Properties以获取host.OnAppDisposing键。

这与阿尔萨斯的答案相同,但我已将其制成扩展方法

public static IAppBuilder RegisterShutdown(this IAppBuilder app, Action callback)
{
    if (app == null)
    {
        throw new ArgumentNullException(nameof(app));
    }

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

    if (token != CancellationToken.None)
    {
        token.Register(callback);
    }

    return app;
}

因为这样您就可以轻松注册关闭操作

app.RegisterShutdown(() => Serilog.Log.CloseAndFlush());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM