【问题标题】:C# EF ASP.NET Web API timeout - how can I call a long running query?C# EF ASP.NET Web API 超时 - 如何调用长时间运行的查询?
【发布时间】:2017-07-01 07:18:06
【问题描述】:

我有一个要执行的 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 调用运行长时间运行的查询?

【问题讨论】:

  • 您可以像这样在控制器中以编程方式设置:- HttpContext.Server.ScriptTimeout = 300;
  • 您可以像这样db.Database.CommandTimeout = 60; 更改DbContext 的超时时间。您介意发布您的 api 代码吗?
  • 其实我忘了问超时是在等待api的时候在你的客户端,还是在执行查询的时候在你的api里面。

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


【解决方案1】:

使用 Sql 增加连接超时。

两种方法来做到这一点

  1. 增加此查询的连接超时时间,例如

db.Database.CommandTimeout = 60

  1. 全局设置超时属性。为此请关注answer

【讨论】:

    【解决方案2】:

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

    db.Database.CommandTimeout = 60;
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 2020-11-20
      • 2017-09-10
      • 2010-11-09
      • 1970-01-01
      相关资源
      最近更新 更多