2013-03-07 14 views
9

Otrzymujemy dziwne zachowanie na naszej stronie po aktualizacji produktu do .NET 4.5. Postaram się być jak najbardziej konkretny, ale problem jest niejasny, więc proszę o cierpliwość. W przypadku tego scenariusza należy także pracować przy założeniu, że nie zastosowano najlepszych praktyk.Prośby ASP.NET i .NET 4.5 - Dziwne zachowanie

Użytkownik przechodzi do strony, która wykonuje asynchronicznie szereg wywołań jquery ajax, do usługi internetowej. Z powodu złego projektowania/kodowania na tej stronie ładowanie może trwać wiecznie, ale zapewnia podmenu, do którego użytkownik potrzebuje dostępu. Gdy strona zacznie się ładować, kliknie jedną z opcji menu, aby przejść do innej strony. Jak dotąd nic nadzwyczajnego.

Gdy używamy perfmon na pudełku z .NET 4.0 zainstalowany tylko widzimy żądań ASP.NET iść w górę iw dół, jak można się spodziewać:

Perfmon on 4.0 box

Kiedy go zainstalować na w pudełku z zainstalowanym .NET 4.5 otrzymujemy: enter image description here

Po wykonaniu przepływu pracy opisanego powyżej, żądanie zostanie zawieszone. Nie w kolejce; oni po prostu tam siedzą.

Po dalszych badaniach zauważymy, że kliknięcie między dwiema różnymi stronami to nie tylko proste href, ale w rzeczywistości jest to Response.Redirect (url);

Ponadto dzieje się tak tylko podczas korzystania z IE. Nie jest to problemem podczas korzystania z przeglądarki Firefox i Chrome.

Oto co staraliśmy się dotąd:

  1. Skontaktowaliśmy M $ i wysłał je DebugDiag wysypisk. Wciąż czekam.
  2. Poszedłem do IIS, ustawiłem witrynę, aby śledzić nieudane żądania, i skonfigurowałem filtr nieudanych żądań, aby dać mi wszystko. Po zablokowaniu witryny wyczyszczę dzienniki, a następnie sprawdzam, co się dzieje po zablokowaniu witryny. Za każdym razem, gdy jest zawieszany między zdarzeniami AspNetSessionDataBegin i AspNetSessionDataEnd.
  3. Mamy HttpHandler, który czyta/zapisuje do sesji, a wyłączenie go wydaje się naprawić problem w przeważającej części, ale bez wyjaśnienia, dlaczego.
  4. Program obsługi onunload firmy jquery, który powinien wyczyścić i anulować wszystkie pozostałe żądania xmlhttp, wydaje się nie być ciągle wykonywany.
  5. Zainstalowany ten patch, nadal nie pomógł.
  6. Obecnie zmienimy metody Response.Redirect (url) w tej logice nawigacji na Response.Redirect (url, false); (Patrz wyżej).

Ponadto zgodnie z wnioskiem, oto kod HttpHandler:

public class KeepSessionAliveHttpHandler : IHttpHandler, IRequiresSessionState 
{ 
    public bool IsReusable 
    { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 

     if (context.Session.IsNewSession) 
     { 
      string redirectUrl = context.Request.Url.AbsoluteUri.Replace(context.Request.Url.AbsolutePath, VirtualPathUtility.ToAbsolute(Constant.Page_Logout)); 
      context.Response.Clear(); 
      context.Response.ContentType = "application/json; charset=utf-8"; 
      context.Response.Flush(); 
      context.Response.Write("{\"IsSessionAlive\": \"false\", \"RedirectUrl\": \"" + redirectUrl + "\"}"); 
     } 
     else 
     { 
      context.Session["KeepSessionAlive"] = TimeZoneHelper.GetCurrentUtcDateTime(); 

      context.Response.Clear(); 
      context.Response.ContentType = "application/json; charset=utf-8"; 
      context.Response.Flush(); 
      context.Response.Write("{\"IsSessionAlive\": \"true\"}"); 
     } 
    } 
} 

Wszelkie sugestie, gdzie powinniśmy szukać dalej?

+0

Co oznacza HttpHandler wyglądać? – Nate

+1

Czy próbowałeś zamknąć swoją odpowiedź? spróbuj { Context.Response.End(); } catch (err ThreadAbortException) { } catch (Exception err) {} – Sameh

+0

@Sameh będę próbować, ale z tego co mogę powiedzieć to wykorzystać do poprzedź te dane do naszych rozmów jQuery AJAX. Zakończenie odpowiedzi zakończyłoby się, zakładam. – Schandlich

Odpowiedz

4

Następująca łatka została wydana przez firmę Microsoft, która wydaje się naprawić problem, bez konieczności zmiany konfiguracji sieci web.config lub IIS. http://support.microsoft.com/kb/2828841/en-us http://support.microsoft.com/kb/2828842/en-us

Były Odpowiedź

Po dalszych badań i wiedzy/Rozwiązania przewidziane przez zespół kompatybilności .NET, mam edytując tę ​​odpowiedź.

Rozwiązanie znalezione pod numerem ManagedPipelineHandler for an AJAX POST crashes if an IE9 user navigates away from a page while that call was in progress wydaje się działać bardziej niezawodnie. Jest to zachowanie, którego doświadczamy w IE8-10, a nie tylko 9 jednak.

Zamierzam zachować tutaj starą odpowiedź, ponieważ może to wskazywać na ludzi w innym kierunku, jeśli pierwsza odpowiedź nie jest istotna.

Dawna dawna odpowiedź

Źródłem zakończyło się blokowanie sesji. Zdarzenia AspNetSessionDataBegin i AspNetSessionDataEnd powinny być martwymi gratisami. Dla każdego, kto natknie się na ten sam problem, zobacz, kiedy i jak piszesz do sesji. Te linki również pomogły.

Replacing ASP.Net's session entirely

I just discovered why all ASP.Net websites are slow, and I am trying to work out what to do about it