我们正在使用ASP.NET 3和.NET 4 - 以及一些不同的IIS(7,8和Express版本)。
无论请求的是什么,对服务器的所有请求都需要长时间,大约10秒。我们可以看到(通过附加调试器)立即调用控制器方法并快速返回(在几毫秒内)。
我们还可以看到,当GET完成时,浏览器会快速完成渲染等(在几毫秒内)。所以延迟在例如'返回视图(无论如何)'和GET完成。这对我来说是类似于View编译的东西 - 但是它发生在每个请求上,所以不应该在第一个请求之后编译View吗?
我们可以使用View预编译,但不幸的是启用它会导致许多错误,我们真的不想重建整个Web项目以使其工作。如上所述,View应该在首次使用时编译,因此预编译应仅对使用特定View的第一个请求有所帮助。
任何想法如何诊断并找出实际花费时间的东西?
编辑:在取出每个页面上呈现的一个部分视图后,突然一切都变得更快。现在调查一下。
答案 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,但我们应该:
我在运行一个分析器之后一直很无能为力,因为它似乎调用了我没想到的控制器方法 - 并且调用的来源似乎来自Telerik的代码(不是我们的代码)。只有当我一次删除一个导航局部视图时,才最终发现了Action()正在做什么。
异步代码非常棒,除非您尝试调试/配置文件,但无法找到它的调用位置!
感谢评论中的建议。