为什么我们的请求需要很长时间才能返回?

时间:2013-05-16 15:59:15

标签: .net asp.net-mvc

我们正在使用ASP.NET 3和.NET 4 - 以及一些不同的IIS(7,8和Express版本)。

无论请求的是什么,对服务器的所有请求都需要时间,大约10秒。我们可以看到(通过附加调试器)立即调用控制器方法并快速返回(在几毫秒内)。

我们还可以看到,当GET完成时,浏览器会快速完成渲染等(在几毫秒内)。所以延迟在例如'返回视图(无论如何)'和GET完成。这对我来说是类似于View编译的东西 - 但是它发生在每个请求上,所以不应该在第一个请求之后编译View吗?

我们可以使用View预编译,但不幸的是启用它会导致许多错误,我们真的不想重建整个Web项目以使其工作。如上所述,View应该在首次使用时编译,因此预编译应仅对使用特定View的第一个请求有所帮助。

任何想法如何诊断并找出实际花费时间的东西?


编辑:在取出每个页面上呈现的一个部分视图后,突然一切都变得更快。现在调查一下。

1 个答案:

答案 0 :(得分:1)

罪魁祸首代码如下:

itemFactory.Add()
    .Text(menuItem.Caption)
    .Selected(menuItem.Selected)
    .Action(menuItem.Action, menuItem.Controller)
    .Enabled(menuItem.Enabled)
    .Visible(menuItem.Visible)
    ;

此C#代码正在构建Telerik PanelBar(菜单)。这个“流畅的界面”的各种方法是在要添加的项目上设置属性。

不幸的是,有一种方法没有像您预期的那样:Action(actionName,controllerName)。

调用此方法实际上是在控制器上执行操作,而不是在单击PanelBar项时设置要执行的控制器操作。

然而,这似乎是异步完成的,因为跟踪上面的代码表明它几乎立即运行,因此被排除了。

修复方法是使用Url方法,而不是Action方法,并使用ASP.NET MVC Url方法构建Url。这是违反直觉的,因为Telerik ASP.NET MVC框架肯定应该首先使用MVC而第二个使用URL,但我们应该:

  1. 咨询文档而不是假设使用了哪些方法
  2. 注意到应用程序突然变得比较大,固定了 金额,每页加载
  3. 我在运行一个分析器之后一直很无能为力,因为它似乎调用了我没想到的控制器方法 - 并且调用的来源似乎来自Telerik的代码(不是我们的代码)。只有当我一次删除一个导航局部视图时,才最终发现了Action()正在做什么。

    异步代码非常棒,除非您尝试调试/配置文件,但无法找到它的调用位置!

    感谢评论中的建议。