【问题标题】:ASP.NET Core : intercept DbContext connection timeout exception inside controllerASP.NET Core:在控制器内拦截 DbContext 连接超时异常
【发布时间】:2021-09-02 09:14:54
【问题描述】:

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

我注意到异常是在 Startup 类的方法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

谢谢

【问题讨论】:

  • 你为什么要那个? DbContext 不是一个连接,它是一个工作单元。它在断开连接的情况下工作,并且仅在加载数据时打开一个短暂的连接,或者在调用SaveChanges 时保留所有缓存的更改。如果要捕获超时异常,请使用 ToListSaveChanges cals 周围的正常异常处理块
  • 另外,您可以实现命令拦截器和/或执行策略。此特定链接适用于 SQL Server,但基础架构适用于所有数据库类型:docs.microsoft.com/en-us/dotnet/architecture/microservices/…
  • @PanagiotisKanavos 我认为这里的问题是用于检测 MySql 实例的运行版本的 AutoDetect 选项。在幕后,它打开与数据库的连接以检索其版本。那么,也许问题是:如何拦截这个超时?

标签: c# exception entity-framework-core asp.net-core-mvc pomelo-entityframeworkcore-mysql


【解决方案1】:

如果您想使用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 类显式设置您的服务器版本。

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

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

【讨论】:

    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多