gpt4 book ai didi

asp.net-mvc - 神秘的 ASP.NET MVC Action 高延迟问题?

转载 作者:行者123 更新时间:2023-12-02 05:11:00 25 4
gpt4 key购买 nike

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

<小时/>

编辑

将 Monitor.Enter 放入我的 HttpModule 的 BeginRequest 中并将 Monitor.Exit 放入 EndRequest 中会导致延迟消失,因此我猜测这与线程化多个请求有关。

<小时/>

我使用 Evan Nagel here 描述的方法用于缓存,但是当我将链接替换为对我自己的 Controller 的调用时,会发生同样的事情,并且该操作仅传递原始文件:

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", 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 执行和执行之间的时间通常为亚毫秒级。我在操作方法周围使用了秒表(ZipController 写入响应流并且不返回结果),并且时间同样总是很小,平均 1.5 毫秒,并且始终低于 10 毫秒。

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

原始文件操作:

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 来跟踪开始/结束请求,并添加日志调用作为我的操作方法的第一个和最后一个语句。长话短说,两个请求同时进入,并且在第一个 EndRequest 之后、第二个调用的操作方法执行之前发生 500 毫秒的延迟。这个延迟通常是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 上创建了一个静态对象,并在 BeginRequest 中调用 Monitor.Enter,在 EndRequest 中调用 Monitor.Exit。延迟消失了。 Chrome 显示一个调用大约需要 15-20 毫秒,另一个调用大约需要 30-40 毫秒,因为它必须等待第一个调用结束,但 500 毫秒的延迟消失了。显然这个解决方案不是最优的。

最佳答案

尝试禁用 session (SessionStateAttribute)。

关于asp.net-mvc - 神秘的 ASP.NET MVC Action 高延迟问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6172350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com