C#EF ASP.NET Web API超时 - 如何调用长时间运行的查询?

时间:2017-02-13 10:26:29

标签: c# asp.net entity-framework asp.net-web-api

我有一个我想要执行的C#代码。

  str = "SELECT u.LastName " +
                      ",COALESCE(COUNT(DISTINCT pc.PhraseId), 0) AS CreatedByQty " +
                      ", COALESCE(COUNT(DISTINCT pm.PhraseId), 0) AS ModifiedByQty " +
                      "FROM dbo.AspNetUsers u " +
                      "LEFT JOIN dbo.Phrase pc " +
                      "ON u.Id = pc.CreatedBy " +
                      "LEFT JOIN dbo.Phrase pm " +
                      "ON u.Id = pm.ModifiedBy " +
                      "GROUP BY u.LastName ";
                threeColQuery = db.Database.SqlQuery<threeCol>(str);
                threeColReport = await threeColQuery.ToListAsync();
                return Ok(threeColReport);

我知道在SQL Server管理器中运行查询大约需要30秒。

在Web API调用中运行时,我得到了:

"innerException":{"message":"An error has occurred.","exceptionMessage":"The wait operation timed 

有没有办法允许WebAPI调用运行长时间运行的查询?

2 个答案:

答案 0 :(得分:2)

修改Entity Framework上的超时设置应该可以解决问题。

db.Database.CommandTimeout = 60;

我还建议不要通过连接字符串设置全局默认超时。对于大多数查询而言,一分钟太高了,您的30秒查询是规则的一个例外(因此您有意识地增加了超时时间)。

通过阻止应用程序中的所有超时异常,您将失去另一个查询行为不当的良好指示 - 导致长期性能问题。

答案 1 :(得分:0)

使用Sql增加连接超时。

两种方法

  1. 增加此查询的连接超时,例如
  2. db.Database.CommandTimeout = 60

    1. 全局设置超时属性。为此,请遵循此answer