На сервере IIS 7 с моим приложением ASP.NET MVC 3 я сталкиваюсь со следующей проблемой: когда у меня есть действие, которое занимает достаточно много времени (например, 30 секунд), оно запускается второй раз после cca15-20 секунд с первого запроса.Я вижу в Fiddler (сниффер HTTP), что браузер не виновник - он отправляет запрос только один раз.Однако в файлах журнала IIS запрос отображается дважды.Однако в журналах IIS оба запроса имеют одну и ту же метку времени (не в моих собственных файлах журнала - там эти два запроса разделены этими 15-20 секундами).
Первоначально действие обрабатывало загруженный файл,хранение его в базе данных и т. д. Однако даже после того, как я изменил действие на простой вызов Thread.Sleep(30000)
, оно все равно вызывается дважды.
Это не вызвано некоторыми неисправными ссылками JavaScript или отсутствующими изображениями, которые кажутсячтобы быть общими причинами такого поведения, когда я читал подобные проблемы здесь, на StackOverflow.Я не могу повторить это на сервере разработки ASP.NET, только на сервере IIS и только на одном из двух, которые я использую.
Это HTML-форма, используемая для запуска этого действия
@model TMAppServer.Abstract.DataTransferObject.ProjectOverviewData
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>UploadTestForm</title>
</head>
<body>
<div>
@using (Html.BeginForm("UploadFileNew", "Manager", new { targetLanguage = "CS" }, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<input id="files" type="file" name="files" /><text><input type="submit" id="uploadFile" value="Upload the document..." /><input type="hidden" name="projectId" id="projectId" value="@(Model.Job.Name)" />
}
</div>
</body>
</html>
Это действие контроллера:
public ActionResult UploadFileNew(string projectId, string targetLanguage, IList<HttpPostedFileBase> files)
{
foreach (var file in files)
{
if (null == file)
continue;
Thread.Sleep(30000);
}
return RedirectToAction("GetProjectOverview", new { projectId = projectId });
}
Спасибо за любые предложения.
РЕДАКТИРОВАТЬ: Теперь я обнаружил, что это происходит только тогда, когда я получаю доступ к серверу через его доменное имяиз той же сети (например, server.domain.com), это НЕ происходит при доступе к серверу через его IP-адрес или из внешней сети.
Вот что я получаю в журналах IIS:
2011-07-21 01:23:31 W3SVC2 WIN-AD50B4LJ2SU 192.168.1.48 POST /manager/upload-file projectId=3366 80 - 192.168.1.1 HTTP/1.1 Mozilla/5.0+(Windows+NT+6.1;+WOW64;+rv:5.0.1)+Gecko/20100101+Firefox/5.0.1 .ASPXAUTH=cookie http://tm.web.com/manager/projects/3366/overview tm.web.com 302 0 0 440 6232309 578
2011-07-21 01:23:31 W3SVC2 WIN-AD50B4LJ2SU 192.168.1.48 GET /manager/projects/3366/overview - 80 - 192.168.1.1 HTTP/1.1 Mozilla/5.0+(Windows+NT+6.1;+WOW64;+rv:5.0.1)+Gecko/20100101+Firefox/5.0.1 .ASPXAUTH=cookie http://tm.web.com/manager/projects/3366/overview tm.web.com 200 0 0 30125 769 93
2011-07-21 01:23:31 W3SVC2 WIN-AD50B4LJ2SU 192.168.1.48 POST /manager/upload-file projectId=3366 80 - 192.168.1.1 HTTP/1.1 Mozilla/5.0+(Windows+NT+6.1;+WOW64;+rv:5.0.1)+Gecko/20100101+Firefox/5.0.1 .ASPXAUTH=cookie http://tm.web.com/manager/projects/3366/overview tm.web.com 302 0 64 0 6232309 39406
А это мои маршруты в Global.asax.cs
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(null,
"manager/upload-file",
new { controller = "Manager", action = "UploadFile" },
new { httpMethod = new HttpMethodConstraint("POST") }
);
routes.MapRoute(null,
"manager/projects/{projectId}/overview",
new { controller = "Manager", action = "GetProjectOverview" },
new { httpMethod = new HttpMethodConstraint("GET") }
);
routes.MapRoute(null,
"manager/{action}",
new { controller = "Manager", action = "Main" },
new { httpMethod = new HttpMethodConstraint("GET") }
);
routes.MapRoute("Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Manager", action = "ListProjects", id = UrlParameter.Optional } // Parameter defaults
);
}