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
    );
}
1
twoflower 11 lipiec 2011, 22:14
Czy masz jakieś 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.
 – 
Kyle Trauberman
11 lipiec 2011, 22:17
Trauberman: Nie, nie używam Html.RenderAction nigdzie w moim projekcie.
 – 
twoflower
11 lipiec 2011, 23:23
Nie mogłem odtworzyć problemu, ale wyświetlenie plików dziennika IIS może pomóc. Czy możesz pokazać mi linie dziennika w formacie W3C z włączonymi wszystkimi polami? Menedżer IIS -> Logowanie -> Format: W3C -> Wybierz pola (zaznacz wszystkie pola). A dodatkowo czy możesz mi pokazać swój plik global.asax?
 – 
reinder
20 lipiec 2011, 17:42
@reinder: Zaktualizowałem swój post. Dziękuję Ci.
 – 
twoflower
20 lipiec 2011, 19:30
Czy jest szansa, że ​​wymuszasz przekierowanie z HTTPS://... na http://... lub odwrotnie? Nie jestem jednak pewien, czy akcja kontrolera zostanie wywołana przed przekierowaniem, ale...
 – 
3Dave
21 lipiec 2011, 23:35

2 odpowiedzi

Najlepsza odpowiedź

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ą?

2
Jason 24 lipiec 2011, 11:17
Najprawdopodobniej jest to problem z konfiguracją sieci, a ponieważ jest tak specyficzny i nawet mam trudności z odtworzeniem go w nieco innych warunkach, przyjmuję to jako odpowiedź.
 – 
twoflower
6 sierpień 2012, 11:34

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.

0
Precious Roy 21 lipiec 2011, 22:57
Próbowałem tego nawet na czystej stronie, żadnych innych znaczników niż sam formularz przesyłania, żadnych programów obsługi javascript, żadnych obrazów, żadnych linków, po prostu pole edycji i przycisk przesyłania. Udało mi się debugować proces bezpośrednio w IIS i nie mogłem zobaczyć czegoś interesującego w żądaniach, oba miały dokładnie ten sam ślad stosu. Skrzypek pokazuje tylko pierwsze żądanie, a nie drugie..
 – 
twoflower
22 lipiec 2011, 12:30
Tak z ciekawości, czy próbowałeś go w różnych przeglądarkach? Czy otrzymujesz takie same wyniki?
 – 
Precious Roy
22 lipiec 2011, 19:13
Nawet po usunięciu wszystkiego ze strony aplikacje MVC są dostarczane z css w folderze Content. Ale prawdopodobnie to sprawdziłeś. Czytałem wiele ostrzeżeń dotyczących wtyczek do przeglądarek, w szczególności Firebuga, które powodują podobne problemy.
 – 
Precious Roy
22 lipiec 2011, 19:31
Tak, próbowałem w kilku przeglądarkach i zawsze zachowuje się tak samo. Myślę, że kluczową obserwacją jest to, że dzieje się tak tylko wtedy, gdy do serwera uzyskuje się dostęp poprzez nazwę domeny z sieci wewnętrznej, ale nie mogę wyciągać z tego żadnych wniosków..
 – 
twoflower
22 lipiec 2011, 23:27
Czy łączysz się przez proxy?
 – 
reinder
23 lipiec 2011, 11:46