Na serwerze IIS 7 z moją aplikacją ASP.NET MVC 3 spotykam się z następującym problemem: gdy akcja trwa dość długo (np. 30 sekund), zostanie ona uruchomiona po raz drugi po ok. 15-20 sekund od pierwszego żądania. Widzę w Fiddlerze (sniffer HTTP), że to nie przeglądarka jest winowajcą - wysyła żądanie tylko raz. Jednak w plikach dziennika IIS widzę żądanie dwukrotnie. Jednak w dziennikach IIS oba żądania mają ten sam znacznik czasu (nie w moich własnych plikach dziennika - tam te dwa żądania są oddzielone tymi 15-20 sekundami).
Pierwotnie akcja przetwarzała przesłany plik, zapisywała go w bazie danych itp. Jednak nawet po zmianie akcji na wywołanie Thread.Sleep(30000)
nadal jest wywoływana dwukrotnie.
Nie jest to spowodowane nieprawidłowym działaniem JavaScriptu lub odwołaniem do brakujących obrazów, które wydają się być częstymi przyczynami tego zachowania, ponieważ czytam o podobnych problemach tutaj na StackOverflow. Nie mogę zreplikować tego na deweloperskim serwerze ASP.NET, tylko na serwerze IIS i tylko na jednym z dwóch używanych przeze mnie.
To jest formularz HTML używany do wywołania tej akcji
@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>
To jest akcja kontrolera:
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 });
}
Dziękujemy za wszelkie sugestie.
EDYCJA: Teraz dowiedziałem się, że dzieje się tak tylko wtedy, gdy uzyskuję dostęp do serwera za pośrednictwem jego nazwy domeny z tej samej sieci (np. server.domain.com), NIE dzieje się to podczas uzyskiwania dostępu do serwera za pośrednictwem jego adresu IP lub z sieć zewnętrzna.
Oto, co otrzymuję w dziennikach 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
A to są moje trasy w 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
);
}
2 odpowiedzi
Z opublikowanych dzienników wygląda na to, że Twój serwer internetowy zwraca HTTP302, który jest „Przeniesiony tymczasowo” lub ponieważ IIS zaimplementuje go w stanie „Przeniesiono obiekt”. To brzmi jak problem z konfiguracją sieci.
Czy dzieje się to z każdą czynnością, czy tylko z tą?
Czy są jakieś inne znaczniki, które mogą przypadkowo odwoływać się do strony? Odwołania do skryptów, odwołania do obrazów, odwołania do css, wszystko to może omyłkowo przywoływać bieżącą stronę. MVC jest znany z tego, że robi to nawet z drobnych błędów, takich jak nieprawidłowe ścieżki obrazu.
Brak zwrócenia wartości false z modułu obsługi kliknięć w javascript na link również może to spowodować. Prawdopodobnie nie jest to twój problem, ponieważ nie widzę tutaj js w twoim kodzie, ale pomyślałem, że wspomnę o tym na wypadek, gdybyś mógł ukryć się na swojej stronie głównej? może wywołać domyślną akcję linku, np.:
<%= Html.ActionLink( "action", "controller" ) %>
$(function() {
$('a').click( function() {
var href = $(this).attr('href');
$.get( href, function() { ... } );
// needs "return false;" here to prevent double request
});
}):
Czy można odtworzyć ten błąd w trybie debugowania? To byłoby najlepsze do przechodzenia przez każdą prośbę krok po kroku. Jeśli nie, uruchomiłbym Fiddlera, aby zbadać każdą prośbę, możesz mieć z tym szczęście. Możesz nawet użyć zdarzenia Application_BeginRequest Global.asax do rejestrowania określonych informacji o każdym żądaniu.
Podobne pytania
Nowe pytania
asp.net
ASP.NET to platforma programistyczna firmy Microsoft do tworzenia aplikacji internetowych, która umożliwia programistom tworzenie dynamicznych witryn internetowych, aplikacji internetowych i usług internetowych. Przydatne jest używanie tego tagu w połączeniu ze znacznikiem typu projektu, np. [asp.net-mvc], [asp.net-webforms] lub [asp.net-web-api]. NIE używaj tego tagu w przypadku pytań dotyczących ASP.NET Core - zamiast tego użyj [asp.net-core].
Html.RenderAction
wezwań w swoich poglądach, które wskazują na to działanie? To może wyjaśnić problem, ponieważ kod zostanie wykonany na serwerze.