【问题标题】:In self-hosted OWIN Web API, how to run code at shutdown?在自托管的 OWIN Web API 中,如何在关机时运行代码?
【发布时间】:2023-03-15 12:23:03
【问题描述】:

我正在使用这些代码 sn-ps 自托管 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 服务关闭时如何运行代码?

【问题讨论】:

    标签: c# asp.net-web-api owin


    【解决方案1】:

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

    【讨论】:

    • 你对properties的实例做了什么?
    • 你可以把它扔掉,它只是app.Properties的包装。
    【解决方案2】:

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

    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 密钥。

    【讨论】:

    • @Wally:如果你能解释一下如何测试它会很棒。
    • 要对其进行测试,请处理 WebApp() 调用的结果并观察 token.Register() 操作中的代码执行。
    • if (token != CancellationToken.None) 有点多余,CancellationToken.None.Register(action) 进行检查并为不可取消的令牌返回一个空的 CancellationTokenRegistration()。你可以做一个单行:new AppProperties(app.Properties).OnAppDisposing.Register(() =&gt; { /* stuff */ });
    • 你真是个忍者!
    猜你喜欢
    • 2018-06-20
    • 2014-09-18
    • 2019-02-24
    • 2015-01-09
    • 2016-12-15
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多