如何在AspNet5 / Mvc6中检测dnx451 Web应用程序关闭?

时间:2015-10-30 16:40:34

标签: asp.net-mvc asp.net-core asp.net-core-mvc application-shutdown

为了能够关闭后台进程(用Quartz.Net实现),我需要检测AspNet5 beta8中的Web应用程序关闭。在以前版本的Asp.Net中,可以在Application_End上执行代码。什么是AspNet5中的Application_End事件的等价物?

到目前为止,我在Configure中尝试了IApplicatonLifetime,但是当我停止Web应用程序时它不会触发:

public void Configure(IApplicationBuilder app, IApplicationLifetime lifetime)
{
    lifetime.ApplicationStopping.Register(() =>
    {
        Logger.LogInformation("Application Stopping. Do stuff.");
    });

    lifetime.ApplicationStopped.Register(() =>
    {        
        Logger.LogInformation("Application Stopped. Do stuff.");
    });
}

我在ApplicationStopping和ApplicationStopped上都没有得到任何回复。

1 个答案:

答案 0 :(得分:4)

我尝试过旧版本(beta5)并且您的代码运行正常。 ApplicationStopping和ApplicationStopped在使用IIS Express并正常停止站点时触发。

似乎在beta8更改后,IIS中的这些事件存在问题。 Beta8 changed IIS hosting所以它使用HttpPlatformHandler来启动dnx进程。不幸的是,似乎没有收到关机事件,请参阅the issue(目前没有关于此问题的详细信息)。

我在我的机器上尝试过beta8,问题似乎仅限于IIS:

  • 当我使用IIS Express时,只会触发ApplicationStarted事件(即使优雅地停止网站)。
  • 但是,如果我运行dnx web,则会触发3个事件。

有几种方法可以使用dnx命令运行项目:

  • 告诉Visual Studio是否要使用IIS Express或dnx命令运行项目。运行按钮中有一个下拉菜单:

    Choosing web or IISExpress when running project

  • 在项目根文件夹中打开命令窗口并运行dnx web(假设web是在project.json文件中配置的命令)。