【发布时间】:2018-01-09 10:03:13
【问题描述】:
我想在我的 ASP.Net Core 2.0 应用程序启动时测试某些条件。例如,如果我的数据库服务器或其他服务器运行正常。这对于仅在请求后实例化的事物(例如我的存储库)特别有用。
目前我必须手动执行此请求,但我希望我的应用程序尽早失败。何时何地推荐这样的测试?
【问题讨论】:
标签: asp.net-core integration startup
我想在我的 ASP.Net Core 2.0 应用程序启动时测试某些条件。例如,如果我的数据库服务器或其他服务器运行正常。这对于仅在请求后实例化的事物(例如我的存储库)特别有用。
目前我必须手动执行此请求,但我希望我的应用程序尽早失败。何时何地推荐这样的测试?
【问题讨论】:
标签: asp.net-core integration startup
Startup 类负责设置您的服务器,使其成为为您的应用程序设置一次性初始化内容的理想选择。
Startup 中通常有两个主要方法:ConfigureServices 和 Configure。前者运行得非常早,负责设置应用程序服务、依赖项和配置。所以你不能用它来实际执行实际工作,尤其是依赖注入容器还没有准备好。
但是,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 中执行代码可能是最好的选择。
【讨论】: