Подтвердить что ты не робот

Загадочная проблема ASP.NET MVC с высокой задержкой?

Используя инструменты разработчика Firebug и Chrome, я могу увидеть загрузку некоторых файлов javascript и css, чтобы действие могло занять дополнительные 500 мс на моей машине разработки. Это происходит с разными файлами при разных вызовах и не имеет значения, в какой порядок я их вставляю. Если я свяжусь напрямую с файлами, эта задержка 500 мс никогда не произойдет. Я могу обновлять страницу снова и снова и получать разные значения, но они всегда выглядят как 500ms, которые были добавлены во время запроса. Если я продолжаю обновлять страницу, дополнительные 500 мс отображаются на разных отдельных файлах, а иногда и на двух файлах, где одна составляет 1000 мс, как на изображении ниже.


ИЗМЕНИТЬ

Ввод Monitor.Enter в мой HttpModule BeginRequest и Monitor.Exit в EndRequest заставил задержку уйти, поэтому я предполагаю, что это имеет какое-то отношение к потоковой обработке нескольких запросов.


Я использую метод, описанный Evan Nagel здесь для кэширования, но то же самое происходит, когда я заменяю ссылки на вызовы на мой собственный контроллер с действием, которое просто передает необработанный файл через:

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, так и с моим локальным сервером IIS в Windows 7 Home Ultimate 64 бит.

Я добавил пользовательский атрибут во время вызовов, а время между OnAction/OnResult Executing и Executed обычно является субмиллисекундным. Я использовал секундомер вокруг метода действия (ZipController записывает в поток ответов и не возвращает результат), и времена также всегда малы, в среднем 1,5 мс и всегда менее 10 мс.

Единственная реальная разница, которую я вижу в заголовках Fiddler, - это заголовок X-AspNetMvc-версии, поэтому я запретил его добавлять и даже удалять заголовок X-AspNet-версии безрезультатно. Я попытался включить и отключить сжатие и обо всем остальном, о котором я тоже могу думать. Это после того, как я добавил собственные заголовки Cache-Control и ETag, которые не повлияли. Интересно, что задержка 500 мс происходит даже в случае 304 Not Modified response, когда тело не отправлено. Иногда два файла будут иметь задержки, один 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 MethodDirect File

Следуя комментарию IanT8, я добавил HttpModule для отслеживания начального/конечного запроса, а также добавления журнальных вызовов в качестве первого и последнего операторов моих методов действий. Короче говоря, оба запроса поступают в одно и то же время, и задержка 500 мс возникает после первого EndRequest, прежде чем будет выполнен метод действия второго вызова. Эта задержка обычно составляет 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 и вызвал Monitor.Enter в BeginRequest и Monitor.Exit в EndRequest. Задержка исчезла. Chrome показывает, что один вызов занимает около 15-20 мс, а другой занимает около 30-40 мс, потому что он должен дождаться завершения первого звонка, но задержка в 500 мс пропала. Очевидно, что это решение не является оптимальным.

4b9b3361

Ответ 1

Попробуйте отключить сеанс (SessionStateAttribute).

Ответ 2

Известна проблема с Cassini и проблемами, связанными с производительностью, с сопоставлением файлов хоста IPv6 через IPv4 и разрешением номера порта, которое Cassini использует в Windows 7. Уже ответил on Qaru и решает проблемы, возникающие в Firefox и Chrome.