C# MVC:超时问题

C# MVC:超时问题,c#,sql-server,asp.net-mvc,exception,C#,Sql Server,Asp.net Mvc,Exception,我试图在MVC中提取SQL server视图的结果。视图本身相对简单,将两个表合并在一起—运行时,返回其行大约需要2秒钟。我已经在MVC中将视图添加到我的模型中 在我的控制器中,我有以下代码,用于以JSON格式从SQL视图返回值:- public JsonResult GetActivity(string LocalIdentifier) { return Json(db.Activities.Where(r => r.LocalIdentifier== LocalIdentif

我试图在MVC中提取SQL server视图的结果。视图本身相对简单,将两个表合并在一起—运行时,返回其行大约需要2秒钟。我已经在MVC中将视图添加到我的模型中

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

public JsonResult GetActivity(string LocalIdentifier) 
{
    return Json(db.Activities.Where(r => r.LocalIdentifier== LocalIdentifier).ToList(), JsonRequestBehavior.AllowGet);
}
当我尝试运行这个程序时,提供一个有效的
LocalIdentifier
会有一段时间什么都没有发生,然后我在VisualStudio中得到一个异常(未在用户代码中处理)。作为参考,这通常只从SQL返回30到50行数据

查看内部异常,我得到以下错误:-

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

我在我的应用程序的其他地方也做过类似的事情,它工作得很好——我看不出我在MVC中的代码有任何错误。还有什么可以帮助我诊断和解决这个问题的吗

更新

有趣的是,我刚刚更改了代码,只提取了一行(只是为了看看会发生什么,请参见下文),它立即运行……这可能是ToList()的问题吗??有没有其他我可以尝试的方法来实现我想做的事情

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

您应该尝试直接在sql server上运行结果查询。我预计查询将运行30秒以上,导致超时。默认超时值为30秒,因此您看到的行为是预期的

2种处理方法:

  • 加快查询速度(可能缺少索引?)
  • 更改默认超时(但我认为这不是首选选项)

这取决于
db.Activities
的定义方式。如果它具有其他实体的属性(表示数据库中的其他表),那么这些属性也可以由EF加载,即使您没有明确指定,因为JSON正在序列化每个对象及其属性。即使是这样一个简单的语句,也可能会加载一半或更多的数据库。

有几个答案可以帮助你更好地理解幕后发生的事情,然后解决它

  • 启用并查看内部的查询
  • 在SSMS中启动此查询并生成
  • 分析计划并更新数据库-更改结构、建立索引、更改查询

  • 如果查询在DB中运行正常,那么您的ORM端部分似乎有问题,您应该在那里搜索问题

    您的DB服务器是否有响应?是的…DB已启动并运行,并且与我的应用程序的其余部分一起工作。由于它返回json格式,您是否设置了服务器授权?可能是函数的调用者未授权调用该函数,可能与函数无关……但您是否正在使用azure sql server paas??我们有一个场景,paas和工会运作出现问题…不,我们没有使用azure。如果应用程序和数据库驻留在不同的服务器上,我认为可能:)因为如果他在sql端进行查询,只需要2秒就可以完成查询,正如我最初的问题中所提到的那样,实际运行查询只需2秒……我之前增加了超时时间,只是为了看看会发生什么,但没有任何更改(除了等待更长时间,直到我得到错误)@MatRichardson是您的
    LocalIdentifier
    在DB端可以为null吗?我已经读到,比较不可为null的标量和可为null的标量需要时间才能完成否,该值不可为null。