asp.net-core – 如何在ApplicationStarted事件中优雅地中止Asp.Net核心启动?

运行Asp.Net Core 1.1

大多数时候,无论启动过程中发生什么,我都希望我的ASP.NET核心应用程序能够运行,但是在启动期间有一些关键错误,我希望它能够关闭.在Startup.cs中,我尝试在Configure方法期间将ApplicationLifetime传递给ApplicationStarted事件:

            appLifetime.ApplicationStarted.Register((al) => {
               var appLtime = (IApplicationLifetime)al;

               try {
                ... various startup code....

               } catch (Exception ex) {
                   appLtime.StopApplication();
               }

            }, appLifetime);

但这结束了这个错误:

Unhandled Exception: System.ObjectDisposedException: The
CancellationTokenSource has been disposed. at
System.Threading.CancellationTokenSource.ThrowObjectDisposedException()
at
Microsoft.AspNetCore.Hosting.WebHostExtensions.<>c__DisplayClass0_0.b__0()
at System.Action`1.Invoke(T obj)

我猜这是因为我在Start()中调用了Stop(),但我不知道其他任何方式.该应用程序确实关闭所以也许没关系,但如果有人有任何建议我真的很感激.

谢谢,
蜂鸣器

最佳答案 我知道这是一个古老的问题,但由于它还没有回答,我只是经历了同样的过程,我想也许我可以帮助其他人在同一条船上.

我正在使用ASP.NET Core 2.1,但解决方案似乎也适用于1.x.

通过向其添加IApplicationLifetime参数并在最后添加ApplicationStarted委托来修改您的Configure方法,如此…

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime applicationLifetime)
{
    // existing code

    applicationLifetime.ApplicationStartup.Register(() => OnStartUp(applicationLifetime));
}

在Startup.cs文件中创建一个OnStartUp方法,就像这样……

public void OnStartUp(IApplicationLifetime applicationLifetime)
{
    try
    {
        // Do your startup magic
    }
    catch(Exception ex)
    {
        applicationLifetime.StopApplication();
    }
}

如果OnStartUp代码出现问题,它现在将成功关闭应用程序,而不会抛出ObjectDisposedException.

点赞