Mehr von Jürgen Gutsch

Mehr von Jürgen Gutsch

Empfehlungen von Jürgen Gutsch

Blog-Empfehlungen von Jürgen Gutsch

Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

Jürgen Gutsch

ASP.NET und mehr...

News

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()
  { }
}

Posted: Freitag, 31. Oktober 2008 14:50 von Jürgen Gutsch
Abgelegt unter: , ,

Kommentare

Peter Bucher sagte:

Salue Jürgen

Und wenn es darum geht, die Request-Zeit-Angabe jeweils in die Seite selber einzubetten (Und nicht an den Schluss):

- http://www.aspnetzone.de/blogs/peterbucher/archive/2008/03/16/requestdauer-mit-einem-httpmodule-und-response-filter-ausgeben.aspx

# Oktober 31, 2008 17:02

Jürgen Gutsch sagte:

Salli Peter,

oh, deinen Artikel hatte ich ganz vergessen...

Dein Ansatz ist natürlich viel eleganter. Und wird auch IMHO keine Pprobleme mit ASP.NET AJAX machen.

Naja, ich wollte halt nur mal eine schnelle Ausgabe für mich persönlich erzeugen. Aber das HttpModul ist ja hier eigentlich eher Nebensache...

# Oktober 31, 2008 18:36
Anonyme Kommentare sind nicht zugelassen