0

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

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

我们还可以看到,当 GET 完成时,浏览器会很快(在几毫秒内)完成渲染等。所以延迟在例如'return View(whatever)'和GET完成之间。这向我暗示了类似于 View 编译的东西 - 但它发生在每个请求上,所以不应该在第一个请求之后编译 View 吗?

我们可以使用 View 预编译,但不幸的是启用它会导致很多错误,我们真的不想重建整个 Web 项目以使其工作。正如我上面所说的,一个视图应该在第一次使用时被编译,所以预编译应该只对使用特定视图的第一个请求有帮助。

知道如何诊断这一点并找出实际花费的时间吗?


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

4

1 回答 1

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. 注意到应用程序在每次页面加载时突然变慢了很大的固定量

运行分析器后我一无所知,因为似乎调用了我没想到的控制器方法 - 调用的来源似乎来自 Telerik 的代码(不是我们的)。只有当我一次删除导航部分视图的一部分时,我才最终发现 Action() 在做什么。

异步代码很棒,除非您尝试调试/分析并且找不到调用它的位置!

感谢评论中的建议。

于 2013-05-21T12:15:23.607 回答