实体框架连接失败火灾和遗忘

时间:2018-03-13 16:07:10

标签: c# multithreading entity-framework-6 asp.net-web-api2 azure-sql-database

我有一个动作过滤器,它继承自ASP.NET Web Api 2环境中的ActionFilterAttribute。在OnActionExecuted覆盖中,我调用以下内容:

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if (!MyCallContext.TimingRecords.Any()) return;
        Task.Run(async () => await DbStore.InsertTimings(MyCallContext. TimingRecords));
    }

目的是不阻止对用户的响应,捕获定时遥测 对InsertTimings的调用调用以下代码:

            _prodActivityDbContext.Timings.AddRange(timings);
            await _prodActivityDbContext.SaveChangesAsync();

有时我收到一条指向实体框架连接失败的错误。 " ex0.Message":"提交数据库事务时报告了错误,但无法确定数据库服务器上的事务是成功还是失败。有关详细信息,请参阅内部异常和http://go.microsoft.com/fwlink/?LinkId=313468。" 我正在使用以下的azure重试策略:

public class SlcsDbConfiguration : DbConfiguration
{
    public SlcsDbConfiguration()
    {
        SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
    }
}

记录总是被成功写入数据库,因此我想知道它与被触发和被遗忘的事实有关,导致发生此错误。

1 个答案:

答案 0 :(得分:1)

Fire and Forget根本不是一个好主意,但有一些可接受的方法可以获得几乎相同的效果。我特别推荐一个名为Hang Fire(https://www.hangfire.io/)的库。 Stephen Cleary在他的博客上提出了一些其他好的方法:http://blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html