ManagedPipelineHandler dla testu AJAX POST ulega awarii, jeśli użytkownik IE9 odejdzie od strony podczas trwania tego połączenia

Scenariusz:

Użytkownik używa IE9 (nie dotyczy IE8 / 10).Użytkownik ma aktywną sesję.Strona uruchamia żądanie AJAX POST (GET nie dotyczy) do kontrolera za pomocąSessionState(SessionStateBehavior.Required) atrybut (ReadOnly nie dotyczy). Coś uniemożliwia natychmiastowe przetworzenie tego żądania (na przykład inne trwające żądanie, które ma zablokowaną sesję).Podczas gdy test AJAX POST jest w toku, użytkownik odchodzi od strony (GET lub POST - nie ma znaczenia)

Wynik:

Test AJAX POST kończy się i zwraca HTTP 500 (który przeglądarka od tego czasu zakończyła, ale można go zobaczyć w dziennikach IIS). Śledzenie nieudanego żądania IIS pokazuje błąd „Podana nazwa sieci nie jest już dostępna. (0x80070040).”Sesja użytkownika jest zablokowana dla miejsca pomiędzy 80 a 120 sekundami (zwykle około 100), zanim zostanie wykonane następne żądanie wymagające dostępu do sesji odczytu / zapisu.

Dalsze kopanie w dzienniku utworzonym przez śledzenie niepomyślnych żądań IIS wskazuje, że AJAX POST ulega awarii w ten sposóbpo stan sesji został zablokowany (podczasREQUEST_ACQUIRE_STATE faza), ale od czasuREQUEST_RELEASE_STATE faza nie zdarza się, blokada sesji nie jest zwolniona. Zakładam, że jest jakiś mechanizm bezpieczeństwa, który odblokowuje sesję po 80-120 sekundach, ale to bardzo długie zawieszenie jest oczywiście niepożądane dla moich użytkowników.

Mam prosty projekt VS2012 / .Net 4.5 / MVC4 demonstrujący problem dostępny na stroniehttps://github.com/jorupp/Ie9SessionCrash (ma jedną stronę, która tworzy serię postów dla akcji z połączeniami Sleep). Śledzenie nieudanego żądania IIS pokazujące problem występuje w projekcie pod adresemhttps://github.com/jorupp/Ie9SessionCrash/tree/master/Ie9SessionCrash/TraceOfHttp500.

Aby obejść ten problem, planujemy zapewnić, że nigdy nie będziemy wykonywać żadnych wywołań AJAX POST do działań wymagających sesji i:

Korzystanie z połączeń GET tam, gdzie to możliweUżywanie wywołań POST do kontrolerów, które mająSessionState(SessionStateBehavior.ReadOnly) atrybut.

Czy jest lepszy sposób, aby sobie z tym poradzić, czy brakuje mi poprawki IIS / .Net w związku z tym? Czy ten scenariusz nie jest ważny z innego powodu? Waham się, czy winić za to ramy / IIS, ale myślę, że wyeliminowałem błąd w kodzie.

questionAnswers(2)

yourAnswerToTheQuestion