2009-07-24 2 views
0

J'ai activé trace pageoutput = "true" dans mon fichier web.config et j'aime la manière simple de voir tout ce contenu au bas de la page.Comment obtenir une sortie de trace ajoutée à context.response dans httphandler?

Je voudrais obtenir la même sortie de trace au bas de la sortie de mon httphandler. Est-il un moyen de vider les mêmes informations de trace via le code qui suivraient ce code:

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; 
     } 
    } 
} 

Je veux surtout voir les formes et les collections QueryString mais tout cela donne est « Bonjour tout le monde ».

- modifier la mise à jour 25/07/2009:

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; 
     } 
    } 
} 

Je suis aussi ouvert à d'autres idées sur la façon la plus facilement obtenir une décharge au format des formulaires et des collections queryString comme trace pageOutput ne.

Répondre

1

Vous pouvez obtenir vos propres événements de suivi à partir du HttpContext.Current.Trace.TraceFinished. Malheureusement, le traçage des pages (qui inclut tous les goodies de Forms, QueryString, etc.) est verrouillé dans les méthodes internes.

Si vous êtes d'accord avec la réflexion, vous pouvez l'appeler comme:

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 sur System.Web.TraceContext.EndRequest devrait vous donner assez pour créer votre propre TracingHttpHandler si vous ne pouvez pas utiliser la réflexion. Il semble que vous ayez oublié BindingFlags.Instance. Aussi, je suppose que vous avez changé using (var htw = ...) en using (object htw = ...) ce qui vous donnerait l'erreur "le type doit être implicitement convertible en IDisposable". Si vous ne pouvez pas utiliser var, vous devrez l'écrire en tant que using (Html32TextWriter htw = ...).

Échantillon complet:

<%@ 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

votre Essayé en utilisant le bloc et il se plaint d'avoir à mettre en œuvre IDisposable alors j'ai essayé: ProcessRequest public void (contexte HttpContext) { de context.Response.ContentType = "text/plain"; context.Response.Write ("Hello World"); objet htw = new System.Web.UI.Html32TextWriter (context.Response.Sortie); { typeof (TraceContext) .GetMethod ("Rendu", System.Reflection.BindingFlags.NonPublic) .Invoke (HttpContext.Current.Trace, nouvel objet [] {htw}); Err sur typeof –

+0

@John Galt - Html32TextWriter * met en oeuvre IDisposable (http://msdn.microsoft.com/fr-fr/library/system.web.ui.html32textwriter.dispose.aspx) et typeof est standard C# (http://msdn.microsoft.com/en-us/library/58918ffs(VS.71).aspx). Postez tout votre code dans votre question (donc c'est formaté), et je peux vérifier la syntaxe. –

+0

Salut Mark ... merci ... s'il vous plaît voir la mise à jour d'édition ci-dessus. –

0

Je ne pense pas que le suivi ASP.NET fonctionne à l'exception des pages.

Est-ce important si la sortie est au bas de la page? Que faire si la sortie se trouvait dans un fichier séparé ou dans le journal des événements? Vous pouvez probablement faire ça avec ASP.NET Health Monitoring.

0

En fait, il est assez simple d'obtenir cette information de ASP.Net aussi longtemps que vous avez le type d'exception correcte. J'utilise ceci dans mon gestionnaire d'erreur global.asax pour une application MVC pour m'envoyer un email l'écran jaune de la trace de la pile de la mort que je ne verrais pas normalement;

 // 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(); 
     } 

Avis dans le deuxième groupe de déclaration que je enveloppe simple, quelle que soit exception a été jeté dans un HttpUnhandledException() qui a la méthode appropriée et gunk à récolter et à cracher tous les goodies.

Questions connexes