查看没有为冗长的请求呈现,但执行了控制器代码

时间:2012-05-02 16:22:52

标签: c# .net asp.net-mvc iis-7

我有一个复杂的动作,可能需要很长时间才能运行。

如果针对一小部分数据运行它,它就能完美运行并生成所需的页面。

如果我处理大量数据并且处理时间超过几分钟,则客户端计算机上仍然会显示该页面,但我们知道(通过堆栈跟踪)我是否正确“ return View(model);“。

为什么会发生这种情况的任何想法?我完全失去了。我已经将每个超时延长到几个小时(包括适用于应用程序池的任何超时)。

这不是一个浏览器问题,因为它已经在Chrome,IE,Safari和Firefox中的几个不同的Windows PC上尝试过。

修改

这发生在应用程序的多个地方,完全不同的事情正在发生。但是所有代码都是为两者执行的。

4 个答案:

答案 0 :(得分:2)

在您调用View(模型)之前,您的模型实际上是否具有所有预期数据?

如果在任何IQuerable或IEnumerable属性上调用ToList(),它是否会返回预期的数据?

你必须发布更多代码才能继续下去。


编辑:

仍然没有足够的信息继续下去,但这里有一些调试技巧。

您的路径是浏览器 - >网络服务器 - >数据库

如果您确定在调用View(模型)之前所有数据都已在模型对象中实现,那么您可以假设问题不在Web服务器中 - >数据库连接。

因此,如果问题出在浏览器之间 - >网络服务器,这里有几个可能性:

  • 你提到了一个大型企业系统:是否涉及任何代理?你可以通过直接连接进行测试吗?

  • 是否有任何内容返回浏览器?你可以telnet到Web服务器的端口80并发出请求吗?你有什么回报吗?

  • 如果您监控浏览器进程,它是否正在执行任何操作?使用procexp,您可以看到每个线程正在做什么 - 浏览器是空闲的,还是使用CPU&吞噬记忆?

  • 是否有其他进程可能拦截请求?某些防病毒产品可能会阻止某些页面呈现。您是否可以禁用防病毒软件并查看是否有任何更改?

  • 您是否尝试过监控服务器以查看发生了什么?处理是否正在发生(并且可能是内存使用量也会增加)?

答案 1 :(得分:1)

您可以完全考虑不同的设计:

  1. 客户端将作业提交至服务器
  2. 服务器启动长时间运行的后台处理
  3. 服务器将作业ID返回给客户端
  4. 客户端使用作业ID定期向服务器查询作业状态
  5. 作业完成后,客户端会以HTML或数据(例如JSON)的形式请求结果,然后呈现。

答案 2 :(得分:0)

IIS处理超时。一旦达到该目的,无论请求在处理流水线的哪个阶段,都终止处理线程。尝试增加web.config中指定的处理超时:

<httpRuntime executionTimeout="90"  />

有关详细信息,请参阅MSDN。请注意,此限制适用于所有页面,因此如果沿着这条路线行驶,请务必小心。

答案 3 :(得分:0)

虽然我还没有看到你的代码,但我的猜测是尝试使用异步控制器(有或没有,通过ajax :-)发出请求,因为很明显,这是一个长期运行的任务,也许你可以还通过一些并行处理来优化处理以减少时间: 这是一个很好的起点 http://msdn.microsoft.com/en-us/library/ee728598.aspx