启动时检查条件

时间:2018-01-09 10:03:14

标签: asp.net-core integration startup

我想在我的ASP.Net Core 2.0应用程序的启动上测试某些条件。例如,如果我的数据库服务器或其他正常运行。这对于仅在请求之后实例化的内容(如我的存储库)特别有用。

目前我必须手动执行此请求,但我希望我的应用程序尽早失败。在什么时候,在什么地方推荐这样的测试?

1 个答案:

答案 0 :(得分:2)

Startup类负责设置您的服务器,使其成为为您的应用程序设置一次性初始化内容的理想选择。

Startup中通常有两种主要方法:ConfigureServicesConfigure。前者运行得很早,负责设置应用程序服务,依赖项和配置。因此,您无法使用它来实际执行实际工作,尤其是因为依赖注入容器还没有准备好。

然而,Configure方法是不同的:虽然它的主要目的是设置应用程序中间件管道,稍后将为请求提供服务的组件,但您可以在此处完全使用您的依赖项,从而可以已经在这里做了更广泛的事情。所以你可以直接在这里打电话。

重要的是要了解Configure在您的服务器实际准备好提供请求之前仍然运行得相当早。因此,如果您的初始化取决于已经存在的实际服务器,您可能应该进一步延迟执行。

正确的解决方案可能会使用IApplicationLifetime进入应用程序生命周期。此类型基本上为您提供了一种注册在应用程序生命周期中执行的回调的方法。在您的情况下,您会对服务器刚刚完成设置阶段并且现在准备好处理请求时运行的ApplicationStarted事件感兴趣。所以基本上是完美的空闲时刻来运行一些额外的初始化。

为了响应生命周期事件,您需要在Configure方法中注册您的处理程序:

public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime)
{
    // other…

    // register lifetime event
    applicationLifetime.ApplicationStarted.Register(InitializeApplication);
}

public void InitializeApplication()
{
    // do stuff
}

最后一点说明:显然,当前an open bug会阻止在IIS上托管时触发生命周期事件。在这种情况下,直接在Configure中执行代码可能是最好的选择。