如何在 ApplicationStarted 事件中优雅地中止 Asp.Net Core 启动?

buz*_*per 8 asp.net-core

运行 Asp.Net Core 1.1

大多数情况下,无论启动过程中发生什么,我都希望我的 ASP.NET Core 应用程序运行,但是在启动过程中存在一些我希望它关闭的严重错误。在 Startup.cs 中,我尝试在 Configure 方法期间将 ApplicationLifetime 传递到 ApplicationStarted 事件中:

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

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

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

            }, appLifetime);
Run Code Online (Sandbox Code Playgroud)

但这结束抛出这个错误:

未处理的异常:System.ObjectDisposedException:CancellationTokenSource 已被处理。在 System.Threading.CancellationTokenSource.ThrowObjectDisposedException() 在 Microsoft.AspNetCore.Hosting.WebHostExtensions.<>c__DisplayClass0_0.b__0() 在 System.Action`1.Invoke(T obj)

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

谢谢,嗡嗡声

小智 5

我知道这是一个老问题,但由于它还没有得到回答,而且我刚刚经历了同样的过程,我想也许我可以帮助其他人在同一条船上。

我使用的是 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));
}
Run Code Online (Sandbox Code Playgroud)

在 Startup.cs 文件中创建一个 OnStartUp 方法,如下所示...

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

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