ASP.NET核心:拦截controller内部的DbContext连接超时异常

ASP.NET Core : intercept DbContext connection timeout exception inside controller

我有一个 ASP.NET 核心 MVC 应用程序,我将 DbContext 注入到控制器中。我想知道有没有办法在构造DbContext返回特定错误响应码时拦截连接超时异常

我注意到 Startup class:

中的方法 AddDbContext 中抛出了异常
services.AddDbContext<MyDbContext>(options =>
        {
            options.UseMySql(Configuration.GetConnectionString("DefaultConnection"),
                ServerVersion.AutoDetect(Configuration.GetConnectionString("DefaultConnection")), o => 
                {
                    o.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery);
                });
        });

编辑:是否可以从 AutoDetect 选项中抛出异常,该选项打开与数据库的连接以检索其版本?我正在使用 Pomelo.EntityFrameworkCore.MySql NuGet 包,版本 5.0.0

谢谢

如果您想使用 ServerVersion.AutoDetect() 方法自动获取您的数据库服务器版本,那么您通常只想在应用程序启动时查询一次,然后在您的 UseMySql() 调用中重新使用它:

var connectionString = Configuration.GetConnectionString("DefaultConnection");
var serverVersion = ServerVersion.AutoDetect(connectionString);

services.AddDbContext<MyDbContext>(options => options
    .UseMySql(connectionString, serverVersion, o => o
        .UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery)));

此外,如果您想要 ServerVersion.AutoDetect() 的一些重试逻辑,请查看 Missing retry policy for ServerVersion.AutoDetect() #1368

您还可以使用 MySqlServerVersionMariaDbServerVersion 类.

显式设置您的服务器版本

Could the exception be thrown from the AutoDetect option which opens a connection to the DB to retrieve its version? I'm using the Pomelo.EntityFrameworkCore.MySql NuGet package, version 5.0.0

是的,这就是您的情况抛出异常的地方。否则,当 DbContext 第一次需要数据库连接时(通常是在您执行第一个查询时),会在稍后的某个时间 after 调用 AddDbContext() 时抛出异常.