首页 > 解决方案 > 等待 ASP.NET Core 中的数据库服务器

问题描述

我的 ASP.NET Core Web 应用程序几乎所有功能都使用数据库。如果没有可用的数据库,它就无法生成单个页面。因此,在应用程序启动时数据库可用是很重要的。(我担心以后会中断数据库中断,从现在开始。)由于数据库在单独的主机上运行,​​它很可能在应该启动 Web 应用程序时关闭。

此外,我确保在应用程序启动时安装了正确的数据库架构。如果数据库架构不是最新的,它可能与安装的应用程序版本不兼容,并且可能会发生崩溃或数据损坏。所以我的应用程序做的第一件事就是查看数据库模式并在需要时对其进行升级。

我现在正在寻找处理数据库停机情况并让应用程序等待数据库的方法。

在启动时等待数据库连接是否有任何最佳实践?我想我只是探测连接并等待它成功。这必须阻止该Configure方法,因为必须在那里完成许多其他初始化工作,但没有数据库就无法完成。但是,如果 Web 应用程序在看到数据库之前应该关闭,那么它也必须可以取消等待并正常关闭应用程序。

这是当前的简化代码:

class Program
{
    public static void Main(string[] args)
    {
        new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .ConfigureAppConfiguration(…)
            .UseStartup<Startup>()
            // ...
            .Build()
            .Run();
    }
}

class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFrameworkNpgsql()
            .AddDbContext<MainDbContext>(options =>
                options.UseNpgsql(Configuration.GetConnectionString("MainDbContext")));
        // Other services
        services.AddMvc(…);
    }

    public void Configure(
    {
        // ...

        // Set up database
        try
        {
            // Check and upgrade database schema...

            // TODO: Block until database is ready; allow cancellation
        }
        catch
        {
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("The application could not be " +
                    "initialized correctly. See the service log for details.");
            });
            return;
        }

        // Initialise other services using database data...

        // Set up ASP.NET
        app.UseStaticFiles();
        app.UseMvc(…);
    }
}

标签: c#.netdatabaseasp.net-core

解决方案


推荐阅读