编辑
将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头部的代码:
<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",path = "~/Scripts/debug/FBINFO.js",contentType = "application/x-javascript" })" type="text/javascript"></script> <script src="@Url.Action("RawFile",path = "~/Scripts/jquery-1.4.1.min.js",contentType = "application/x-javascript" })" type="text/javascript"></script>
这似乎不会在我的生产服务器上发生,至少不是很频繁,但是更难说,因为延迟更高.这是不是不要担心?会造成什么?它发生在Cassini和我的本地IIS服务器在Windows 7 Home Ultimate 64位.
我添加了一个自定义属性来调用调用,OnAction / OnResult Executing和Executed之间的时间通常是毫秒级.我在操作方法周围使用了一个秒表(ZipController写入响应流并且不返回结果),并且时间同样总是很小,平均为1.5ms,总是在10ms以下.
在Fiddler头文件中我唯一真正的区别是X-AspNetMvc-Version头,所以我设置它不被追加,甚至删除X-AspNet-Version头无效.我尝试启用和禁用压缩,以及我能想到的其他一切.这是在我添加了自己的Cache-Control和ETag头后没有效果.有趣的是,即使在不发送身体的304未修改响应的情况下,也会发生500ms的延迟.有时两个文件会有延迟,一个500ms,另外1000ms.
直接文件:
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
根据IanT8的评论,我添加了一个HttpModule来跟踪开始/结束请求,以及添加日志调用作为我的动作方法的第一个和最后一个语句.长篇小说,两个请求同时进入,在执行第二个调用的动作方法之前,在第一个EndRequest之后发生500ms的延迟.这个延迟通常是499ms,一次是497ms,一次498ms,一次492ms.
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-20ms,另外一个通话需要30-40ms,因为它必须等待第一个通话结束,但是500ms的延迟已经消失.这个解决方案显然不是最佳的.