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

时间:2017-02-21 14:33:09

标签: 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);

但是这样就结束了这个错误:

  

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

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

谢谢, 蜂音

1 个答案:

答案 0 :(得分:1)

我知道这是一个古老的问题,但是由于尚未回答,我只是经历了相同的过程,所以我想也许我可以在同一条船上帮助其他人。

我正在使用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