0

web.config で trace pageoutput="true" を有効にしましたが、ページの下部にあるすべてのものを簡単に確認できる方法が気に入っています。

httphandler からの出力の下部にある trace から同じ出力を取得したいと思います。このコードに続くコードを介して同じトレース情報をダンプする方法はありますか:

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

Forms コレクションと QueryString コレクションを特に見たいのですが、これで得られるのは "Hello World" だけです。

-- 2009 年 7 月 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;
        }
    }
}

また、pageOutput トレースのように、フォームとクエリ文字列コレクションのフォーマットされたダンプを最も簡単に取得する方法について、他のアイデアも受け入れます。

4

3 に答える 3

1

HttpContext.Current.Trace.TraceFinishedから独自のトレース イベントを取得できます。残念ながら、ページ トレース (Forms、QueryString などのすべての利点を含む) は、内部メソッドでロックされています。

リフレクションに問題がない場合は、次のように呼び出すことができます。

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

リフレクションを使用できない場合は、リフレクト オーバーSystem.Web.TraceContext.EndRequestで十分に独自のものを作成できます。TracingHttpHandler

編集: を忘れたようですBindingFlags.Instance。また、「タイプは暗黙的にIDisposableに変換可能でなければなりません」というエラーが発生するように変更using (var htw = ...)したと思います。using (object htw = ...)が使えない場合varは と書く必要がありますusing (Html32TextWriter htw = ...)

完全なサンプル:

<%@ 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 });
       } 
    }
}
于 2009-07-24T20:56:54.860 に答える
0

ASP.NET トレースは、ページ以外では機能しないと思います。

出力がページの下部にあるかどうかは問題ですか? 出力が別のファイルまたはイベント ログにある場合はどうなりますか? おそらくASP.NET Health Monitoringでこれを行うことができます。

于 2009-07-24T20:23:45.037 に答える
0

実際には、正しい例外タイプを持っている限り、ASP.Net からこの情報を取得するのは非常に簡単です。MVC アプリの global.asax エラー ハンドラーでこれを使用して、通常は表示されないデス スタック トレースのイエロー スクリーンをメールで送信します。

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

2 番目のステートメント グループで、HttpUnhandledException() でスローされたすべての例外を単純にラップしていることに注意してください。これには、すべてのグッズを収集して吐き出すための適切なメソッドとガンクがあります。

于 2012-07-05T09:15:46.403 に答える