2013-03-07 4 views
9

Wir bekommen seltsames Verhalten auf unserer Website nach dem Upgrade auf .NET 4.5. Ich werde versuchen, so spezifisch wie möglich zu sein, aber das Problem ist vage, also bitte ertragen Sie mit mir. Arbeiten Sie in diesem Szenario auch unter der Annahme, dass keine bewährten Verfahren befolgt wurden.ASP.NET Requests und .NET 4.5 - Seltsames Verhalten

Der Benutzer kommt auf eine Seite, die eine Reihe von jQuery Ajax asynchron an einen Webservice aufruft. Aufgrund des schlechten Designs/Codierens auf dieser Seite kann das Laden dauernd dauern, aber es bietet ein Untermenü, auf das der Benutzer zugreifen muss. Sobald die Seite geladen wird, klicken sie auf eine der Menüoptionen, um zu einer anderen Seite zu wechseln. Nichts Besonderes bisher.

Wenn wir perfmon auf einem Feld mit .NET 4.0 nur installiert verwenden, können wir die ASP.NET Anfragen gehen nach oben und unten sehen, wie man erwarten würde:

Perfmon on 4.0 box

Wenn wir es bei der Installation eine Box mit .NET 4.5 installiert bekommen wir: enter image description here

Nach Ausführen des oben beschriebenen Workflow, die Anfrage wird aufgelegt. Nicht in der Warteschlange; sie sitzen einfach da.

Nach weiteren Recherchen stellen wir fest, dass das Klicken zwischen den zwei verschiedenen Seiten nicht nur eine einfache href ist, sondern tatsächlich Response.Redirect (url) verwendet;

Auch dies geschieht nur bei Verwendung von IE. Dies ist kein Problem bei der Verwendung von Firefox und Chrome.

Hier ist, was wir bisher versucht haben:

  1. Wir kontaktiert haben, M $ und schickte sie aus DebugDiag Dumps. Warte noch.
  2. Ich bin zu IIS gegangen, habe die Site eingestellt, um fehlgeschlagene Anfragen zu verfolgen, und habe einen Filter für fehlgeschlagene Anfragen eingerichtet, um mir alles zu geben. Sobald die Website gesperrt ist, lösche ich die Protokolle und untersuche dann, was nach der Sperrung der Website eingeht. Jedes Mal, wenn es zwischen den Ereignissen AspNetSessionDataBegin und AspNetSessionDataEnd hängen bleibt.
  3. Wir haben einen HttpHandler, der liest/schreibt in die Sitzung, und die Deaktivierung scheint das Problem größtenteils zu beheben, aber keine Erklärung, warum.
  4. jquery's onunload-Handler, der alle verbleibenden xmlhttp-Anfragen bereinigen und abbrechen sollte, scheint nicht ständig ausgeführt zu werden.
  5. Installierte diese patch, immer noch nicht geholfen.
  6. Wir ändern derzeit die Methoden Response.Redirect (url) in dieser Navigationslogik auf Response.Redirect (url, false); (Siehe oben).

auch wie gewünscht, hier ist der Httphandler Code:

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\"}"); 
     } 
    } 
} 

Irgendwelche Vorschläge, wo wir als nächstes aussehen sollte?

+0

Wie sieht das wie Httphandler aussehen? – Nate

+1

Haben Sie versucht, Ihre Antwort zu schließen? versuchen Sie { Context.Response.End(); } catch (Threadabort err) { } catch (Exception err) {} – Sameh

+0

@Sameh Ich versuche, aber von dem, was ich kann sagen, dass wir diese nutzen diese Daten, um unsere Jquery Ajax-Aufrufe vorangestellt wird. Das Ende der Antwort würde es beenden, nehme ich an. – Schandlich

Antwort

4

Der folgende Patch wurde jetzt von Microsoft veröffentlicht, der scheinbar das Problem behebt, ohne dass web.config oder IIS-Konfigurationsänderungen erforderlich sind. http://support.microsoft.com/kb/2828841/en-us http://support.microsoft.com/kb/2828842/en-us

ehemalige Antwort

Nach einer weiteren Untersuchung und Einsicht/Lösungen von .NET Kompatibilität Team zur Verfügung gestellt, ich bin der Bearbeitung diese Antwort.

Die bei ManagedPipelineHandler for an AJAX POST crashes if an IE9 user navigates away from a page while that call was in progress gefundene Lösung scheint für uns zuverlässiger zu funktionieren. Das ist Verhalten, das wir in IE8-10 erlebt haben, und nicht nur 9.

Ich werde die alte Antwort hier behalten, da es hoffentlich Leute in eine andere Richtung zeigen kann, wenn die erste Antwort nicht relevant ist.

Former Former Antwort

Die Quelle endete session locking zu sein. Die Ereignisse AspNetSessionDataBegin und AspNetSessionDataEnd sollten ein totales Werbegeschenk sein. Für jeden, der auf dasselbe Problem stolpert, schauen Sie, wann und wie Sie in die Sitzung schreiben. Diese Links haben auch geholfen.

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