神秘的ASP.NET MVC Action高延迟问题?

时间:2011-05-30 04:43:50

标签: asp.net-mvc asp.net-mvc-3

使用Firebug和Chrome开发人员工具,我可以看到通过动作加载一些javascript和css文件可能会在我的开发机器上花费额外的500毫秒。这种情况发生在不同调用的不同文件中,无论我将它们放入什么顺序都无关紧要。如果我直接链接到文件,则不会发生这500ms的延迟。我可以反复刷新页面并获得不同的值,但它们总是看起来像请求时间中添加了500毫秒。如果我不断刷新页面,额外的500毫秒会出现在不同的单个文件上,有时会出现两个文件,其中一个是1000毫秒的延迟,如下图所示。


修改

将Monitor.Enter置于我的HttpModule的BeginRequest和EndRequest中的Monitor.Exit导致延迟消失,所以我的猜测是它与线程化多个请求有关。


我使用Evan Nagel here描述的方法进行缓存,但是当我通过一个只传递原始文件的动作替换调用我自己的控制器的链接时,会发生同样的事情:

public FileResult RawFile(string path, string contentType)
{
    var server = HttpContext.Server;
    string decodedPath = server.UrlDecode(path);
    string mappedPath = server.MapPath(decodedPath);
    return File(mappedPath, contentType);
}

这是我在html的head部分中的代码:

<link rel="stylesheet" href="@Url.Action("RawFile", new { controller = "Content", path = "~/Content/Site.css", contentType = "text/css" })" type="text/css" />
<script src="@Url.Action("RawFile", new { controller = "Content", path = "~/Scripts/debug/FBINFO.js", contentType = "application/x-javascript" })" type="text/javascript"></script>
<script src="@Url.Action("RawFile", new { controller = "Content", path = "~/Scripts/jquery-1.4.1.min.js", contentType = "application/x-javascript" })" type="text/javascript"></script>

这似乎不会在我的生产服务器上发生,至少不会经常发生,但由于延迟通常较高,因此很难判断。这不用担心吗?会是什么原因造成的?它发生在Cassini和Windows 7 Home Ultimate 64位上的本地IIS服务器上。

我添加了一个自定义属性来为调用计时,OnAction / OnResult执行和执行之间的时间通常是亚毫秒。我在action方法周围使用了一个秒表(ZipController写入响应流并且不返回结果),时间总是很小,平均1.5ms,总是不到10ms。

我在Fiddler标头中看到的唯一真正的区别是X-AspNetMvc-Version标头,所以我将其设置为不附加,甚至删除了X-AspNet-Version标头也无济于事。我已经尝试过启用和禁用压缩以及我能想到的其他所有内容。这是在我添加了自己的Cache-Control和ETag标头之后没有任何效果。有趣的是,即使在没有发送身体的304 Not Modified响应的情况下,也会发生500ms的延迟。有时两个文件会有延迟,一个500毫秒,另一个1000毫秒。

直接档案:

HTTP/1.1 200 OK
Content-Type: application/x-javascript
Last-Modified: Sun, 29 May 2011 22:42:27 GMT
Accept-Ranges: bytes
ETag: "b57a84af511ecc1:0"
Server: Microsoft-IIS/7.5
Date: Mon, 30 May 2011 04:38:20 GMT
Content-Length: 1336

RawFile行动:

HTTP/1.1 200 OK
Cache-Control: public
Content-Type: application/x-javascript
ETag: "CD9F383D0537373C6D2DC8F60D6519A6"
Server: Microsoft-IIS/7.5
Date: Mon, 30 May 2011 04:34:37 GMT
Content-Length: 1336

Action Method Direct File

根据IanT8的评论,我添加了一个HttpModule来跟踪开始/结束请求,以及添加日志调用作为我的操作方法的第一个和最后一个语句。长话短说两个请求同时进入,并且在执行第二个调用的action方法之前,在第一个EndRequest之后发生500ms延迟。这个延迟通常是499毫秒,但一次是497毫秒,一次是498毫秒,一次是492毫秒。

2011-05-31 00:55:19.1874|INFO|20110531 00:55:19.196 BeginRequest: http://localhost:51042/Zip/Style?Path=~/Content/Site.css
2011-05-31 00:55:19.1874|INFO|20110531 00:55:19.197 BeginRequest: http://localhost:51042/Zip/Script?Path=~/Scripts/jquery-1.4.1.min.js|~/Scripts/debug/FBINFO.js
2011-05-31 00:55:19.2034|INFO|20110531 00:55:19.203 Style() Start
2011-05-31 00:55:19.2034|INFO|20110531 00:55:19.208 Style() End
2011-05-31 00:55:19.2034|INFO|20110531 00:55:19.212 EndRequest: http://localhost:51042/Zip/Style?Path=~/Content/Site.css
2011-05-31 00:55:19.7044|INFO|20110531 00:55:19.704 Script() Start
2011-05-31 00:55:19.7044|INFO|20110531 00:55:19.712 Script() End
2011-05-31 00:55:19.7044|INFO|20110531 00:55:19.713 EndRequest: http://localhost:51042/Zip/Script?Path=~/Scripts/jquery-1.4.1.min.js|~/Scripts/debug/FBINFO.js

现在是真正有趣的部分。我在HttpModule上创建了一个静态对象,并在EndRequest中的BeginRequest和Monitor.Exit中调用了Monitor.Enter。延迟消失了。 Chrome显示一个呼叫大约需要15-20毫秒,另一个大约需要30-40毫秒,因为它必须等待第一个呼叫结束,但500毫秒的延迟消失了。显然这个解决方案并不是最优的。

2 个答案:

答案 0 :(得分:6)

尝试禁用会话(SessionStateAttribute)。

答案 1 :(得分:0)

Cassini与IPv4上的IPv6主机文件映射存在一个已知问题,以及Cassini在Windows 7下使用的端口号解析。在Stack Overflow上它是already answered并解决了Firefox中出现的问题和Chrome。