2009-07-24 6 views
0

Ich habe Trace pageoutput = "true" in meiner web.config aktiviert und ich mag die einfache Art und Weise, wie all diese Dinge am Ende der Seite angezeigt werden.Wie wird die Trace-Ausgabe zu context.response in httphandler hinzugefügt?

Ich möchte die gleiche Ausgabe von Trace am unteren Ende der Ausgabe von meinem httphandler bekommen. Gibt es einen Weg, um die gleiche Spur Informationen über den Code auskippen, die diesen Code folgen würden:

public class UploadHandler : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.ContentType = "text/plain"; 
     context.Response.Write("Hello World"); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

Ich möchte vor allem die Formulare und Abfrage-Zeichenfolge-Sammlungen sehen, aber das alles gibt, ist „Hallo Welt“.

- bearbeiten Update 2009.07.25:

public class UploadHandler : IHttpHandler 
    { 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.ContentType = "text/plain"; 
     context.Response.Write("Hello World"); 

     object htw = new System.Web.UI.Html32TextWriter(context.Response.Output); 
     { 
      typeof(TraceContext) 
       .GetMethod("Render", System.Reflection.BindingFlags.NonPublic) 
       .Invoke(HttpContext.Current.Trace, new object[] { htw }); 
     } 

    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

Ich bin auch offen für andere Ideen, wie man am einfachsten eine formatierte Dump der Formulare erhalten und Abfragezeichensammlungen wie pageoutput Spur tut.

Antwort

1

Sie können Ihre eigenen Trace-Ereignisse von HttpContext.Current.Trace.TraceFinished erhalten. Leider ist die Seitenverfolgung (die alle Goodies von Forms, QueryString usw. enthält) in internen Methoden gesperrt.

Wenn Sie mit Reflektion in Ordnung sind, können Sie es gerne nennen:

using (var htw = new System.Web.UI.Html32TextWriter(response.Output)) { 
    typeof(TraceContext) 
     .GetMethod("Render",BindingFlags.NonPublic | BindingFlags.Instance) 
     .Invoke(HttpContext.Current.Trace, new object[] { htw }); 
} 

Reflectoring über System.Web.TraceContext.EndRequest sollten Sie genug geben Sie Ihre eigenen TracingHttpHandler zu erstellen, wenn Sie nicht Reflexion verwenden können.

Bearbeiten: Es sieht aus wie Sie BindingFlags.Instance vergessen haben. Auch ich vermute, dass Sie using (var htw = ...) in using (object htw = ...) geändert haben, die Ihnen den "Typ implizit konvertierbar zu IDisposable" Fehler geben würde. Wenn Sie var nicht verwenden können, müssen Sie es als using (Html32TextWriter htw = ...) schreiben.

Voll Beispiel:

<%@ WebHandler Language="C#" Class="UploadHandler" %> 

using System; 
using System.Web; 
using System.Web.UI; 
using System.Reflection; 

public class UploadHandler : IHttpHandler { 
    public bool IsReusable { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) { 
     // the output will suck as text/plain - Render outputs HTML. 
     context.Response.ContentType = "text/html"; 
     context.Response.Write("Hello World!"); 

     // depending on web.config settings, you may need to enable tracing manually 
     HttpContext.Current.Trace.IsEnabled = true; 
     // I had to write a custom trace message, or the Request context wasn't captured - YMMV 
     HttpContext.Current.Trace.Write(null); 

     using (Html32TextWriter htw = new Html32TextWriter(context.Response.Output)) { 
      typeof(TraceContext) 
       .GetMethod("Render", BindingFlags.NonPublic | BindingFlags.Instance) 
      .Invoke(HttpContext.Current.Trace, new object[] { htw }); 
     } 
    } 
} 
+0

Versucht Ihr mit Block und er beschwerte sich über IDisposable implementieren zu müssen, so habe ich versucht: public void Process (Httpcontext context) { context.Response.ContentType = "text/plain"; context.Response.Write ("Hallo Welt"); Objekt htw = neu System.Web.UI.Html32TextWriter (context.Response.Ausgabe); { typeof (TraceContext) . GetMethod ("Render", System.Reflection.BindingFlags.NonPublic) . Invoke (HttpContext.Current.Trace, neues Objekt [] {htw}); } } Err auf TypeOf –

+0

@ John Galt - Html32TextWriter * nicht * implementieren IDisposable (http://msdn.microsoft.com/en-us/library/system.web.ui.html32textwriter.dispose.aspx) und typeof ist Standard C# (http://msdn.microsoft.com/en-us/library/58918ffs(VS.71).aspx). Veröffentlichen Sie Ihren gesamten Code in Ihrer Frage (so dass er formatiert ist), und ich kann die Syntax überprüfen. –

+0

Hallo Markus ... danke ... bitte sehen Sie das Update Update oben. –

0

Ich glaube nicht, dass ASP.NET-Ablaufverfolgung mit Ausnahme von Seiten funktioniert.

Ist es wichtig, ob die Ausgabe am Ende der Seite ist? Was wäre, wenn die Ausgabe in einer separaten Datei oder im Ereignisprotokoll wäre? Sie könnten wahrscheinlich thsi mit ASP.NET Health Monitoring tun.

0

Eigentlich ist es ziemlich einfach, diese Informationen von ASP.Net zu erhalten, solange Sie den richtigen Ausnahmetyp haben. Ich benutze dies in meinem global.asax-Fehlerhandler für eine MVC-App, um mir den gelben Bildschirm des Todesstack-Trace zu mailen, den ich normalerweise nicht sehen würde;

 // See if ASP.Net has some error handling info for us first 
     string htmlError = null; 
     var httpException = e as HttpException; 
     if (httpException != null) 
      htmlError = httpException.GetHtmlErrorMessage(); 
     else 
     { 
      // Ok, we'll generate our own then 
      var h = new HttpUnhandledException(e.Message, e); 
      htmlError = h.GetHtmlErrorMessage(); 
     } 

Hinweis in der zweiten Anweisung Gruppe, die ich einfach einpacken, was Ausnahme in einer HttpUnhandledException geworfen wurde(), die die entsprechende Methode und klebrige Masse hat zu ernten und alle guten Sachen auszuspucken.

Verwandte Themen