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

C# 在自托管OWIN Web API中,如何在关闭时运行代码?,c#,asp.net-web-api,owin,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.UseWe

我使用以下代码片段自托管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")
类启动
{
公共无效配置(IAppBuilder appBuilder)
{
var config=新的HttpConfiguration();
var route=config.Routes.maphttroute(“DefaultApi”、“{controller}”);
appBuilder.UseWebApi(配置);
}
}
WebApp.Start(“http://localhost:8080")
我想在Web API服务关闭时运行一些代码。我正在寻找类似于
HttpApplication.Application\u End
、一个
Disposed
事件或一个位置正确的
override void Dispose()


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

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

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
            });
        }
    }
}
公共类启动
{
公共无效配置(IAppBuilder应用程序)
{
var context=新文本(app.Properties);
var token=context.Get(“host.OnAppDisposing”);
if(令牌!=CancellationToken.None)
{
令牌.寄存器(()=>
{
//要运行的代码
});
}
}
}
Katana团队中有人告诉我,此密钥用于特定于主机的功能,因此可能不存在于所有主机上。确实实现了这一点,但我不确定其他的


验证这是否对您有效的最简单方法是检查
host.OnAppDisposing
键的
app.Properties

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

var properties = new AppProperties(app.Properties);
CancellationToken token = properties.OnAppDisposing;
AppProperties
位于名称空间
Microsoft.Owin.BuilderProperties
下,该名称空间来自此nuget软件包:

属性
OnAppDisposing
的描述说明:

获取或设置“host.OnAppDisposing”的取消令牌


请参阅:

@Wally:如果您解释如何测试它,那就太好了。要测试它,请处理WebApp()调用的结果,并观察token.Register()操作中的代码执行。
if(token!=CancellationToken.None)
有点多余,CancellationToken.None.Register(action)对不可取消的令牌执行检查并返回空的CancellationTokenRegistration()。您可以使用一行代码:
newappproperties(app.Properties).OnAppDisposing.Register(()=>{/*stuff*/})属性
的实例?您可以将其扔掉,它只是
app.properties
的包装。