ASP.NET AJAX Request in einem HttpModule erkennen
Um die Abarbeitungszeit einer Seite als HTML Komentar auszugeben hatte ich ein ganz einfaches HttpModule geschrieben, das mit die Zeit von BeginRequest bis EndRequest ermittelt und entsprechend ausgibt.
Das Resultat war, dass ich heute den ganzen nach der Ursache dafür suchte wieso kein UpdatePanel mehr aktualisiert wurde. Der PostBack wurde durchgeführt, das UpdateProgress wurde ausgelöst aber das UpdatePanel eben nicht aktualisiert. Auf den Fehler bin ich gekommen, als ich dann die Änderungen der letzten Tage angeschaut und temporär rückgängig gemacht hatte.
Das verflixte an der Sache war eigentlich nur, dass im Firefox (den ich vorzugsweise zum entwickeln verwende) absolut keine Fehlermeldung ausgegeben wurde. Im IE gibt es eine schöne JavaScript Meldung.
Was war passiert?
Eigentlich logisch: Das HttpModule sprang an und hat den HTML Kommentar and die Ausgabe - die eigentlich für das JavaScript des ASP.NET AJAX gedacht war - angehängt. Ein HttpModul springt bei jedem Request an, der über die aspnet_isapi.dll abgearbeitet wird. So natürlich auch bei einem ASP.NET AJAX Request. (Im IIS7 und im Web Development Server übrigens auch bei allen anderen Requests, wie Bildern, JavaScripts, etc.).
An den ASP.NET AJAX Response wurde also mein Kommentar angehängt und das JavaScript ist nicht mehr in der Lage den Response zu parsen und bricht (im IE) mit einem Fehler ab.
Naja, zu Glück gibt es Suchmaschinen und Geeks die das gleiche Problem bereits hatten:
http://blog.seesharp.org/blog/post/2007/10/Detecting-Aspnet-Ajax-Request-In-Custom-HttpModule.aspx
@Gokhan Demir: çok teşekkürler.
Meine HttpModule sieht jetzt also wie folgt aus:
public class PageProcessingTime : IHttpModule
{
private DateTime dtStart = DateTime.MinValue;
private HttpApplication httpApplication;
public PageProcessingTime()
{ }
public void Init(System.Web.HttpApplication application)
{
httpApplication = application;
httpApplication.BeginRequest +=
new System.EventHandler(BeginRequest);
httpApplication.EndRequest +=
new System.EventHandler(EndRequest);
}
public void BeginRequest(object sender, EventArgs e)
{
dtStart = DateTime.Now;
}
public void EndRequest(object sender, EventArgs e)
{
TimeSpan tsProcessingTime = DateTime.Now - dtStart;
if (httpApplication.Context.CurrentHandler is Page &&
httpApplication.Request.Headers["x-microsoftajax"] == null)
httpApplication.Response.Write("\n<!-- Request Processing Time: "
+ tsProcessingTime.ToString() + " -->");
}
public void Dispose()
{ }
}