我有一个动作过滤器,它继承自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());
}
}
记录总是被成功写入数据库,因此我想知道它与被触发和被遗忘的事实有关,导致发生此错误。
答案 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