MVC:超时问题

时间:2016-03-07 08:49:09

标签: c# sql-server asp.net-mvc exception

我正在尝试在MVC中提取SQL Server视图的结果。视图本身相对简单,UNION将几个表放在一起 - 运行时返回行需要大约2秒钟。我在MVC中将视图添加到我的模型中。

在我的控制器中,我有以下代码,它旨在以JSON格式返回SQL视图中的值: -

public JsonResult GetActivity(string LocalIdentifier) 
{
    return Json(db.Activities.Where(r => r.LocalIdentifier== LocalIdentifier).ToList(), JsonRequestBehavior.AllowGet);
}

当我尝试运行它时,提供有效的LocalIdentifier暂时没有任何反应,然后我在Visual Studio中得到一个异常(在用户代码中未处理)。作为参考,这通常只返回来自SQL的30到50行数据。

查看内部异常我收到此错误: -

“超时已过期。操作完成前经过的超时时间或服务器没有响应。”

我在我的应用程序的其他地方做过类似的事情并且工作正常 - 我在MVC中看不出我的代码有什么问题。还有什么我可以看看来帮助诊断和解决这个问题吗?

更新

有趣的是,我刚刚更改了代码,只提取了一行(只是为了看看会发生什么 - 见下文)并立即运行......这可能是ToList()的问题吗?是否有另一种方法可以实现我想要尝试做的事情?

public JsonResult GetActivity(string LocalIdentifier) 
{
    return Json(db.Activities.First(r => r.LocalIdentifier== LocalIdentifier), JsonRequestBehavior.AllowGet);
}

3 个答案:

答案 0 :(得分:0)

您应该尝试直接在sql server上运行生成的查询。我希望查询运行超过30秒,导致超时。默认超时值为30秒,因此您预期会看到您的行为。

处理它的两种方法:

  • 加快查询速度(也许您错过了索引?)
  • 更改默认超时(但我认为这不是首选选项)

答案 1 :(得分:0)

这取决于db.Activities的定义方式。如果它具有其他实体的属性(意味着数据库中的其他表),那么这些也可以由EF加载,即使您没有明确指定,因为JSON正在序列化每个对象其属性。即使是像这样的简单陈述,数据库的一半或更多也可能最终被加载
This SO question有几个答案可以帮助您更好地了解幕后发生的事情,然后进行修复。

答案 2 :(得分:0)

  1. 启用profiling并查看
  2. 中的查询
  3. 在SSMS中启动此查询并构建query execution plan
  4. 分析计划并对数据库进行更新 - 更改结构,构建索引,更改查询
  5. 如果查询在DB中运行正常,那么您的ORM侧面部分似乎有问题,您应该在那里搜索问题