C# 重定向Trace.axd输出

C# 重定向Trace.axd输出,c#,debugging,.net-3.5,C#,Debugging,.net 3.5,我有一个自定义控件,它只显示一组给定的配置值 我想捕获trace.axd数据并将其输出到此控件 web.config writeToDiagnosticsTrace="true" ... <listeners> name="WebPageTraceListener" type="System.Web.WebPageTraceListener, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b

我有一个自定义控件,它只显示一组给定的配置值

我想捕获trace.axd数据并将其输出到此控件

web.config

writeToDiagnosticsTrace="true" 
...
<listeners>
 name="WebPageTraceListener"
    type="System.Web.WebPageTraceListener, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
</listeners>
writeToDiagnosticsTrace=“true”
...
name=“WebGetRaceListener”
type=“System.Web.WebPageTraceListener,System.Web,版本=2.0.3600.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a”

我希望能够在usercontrol中加载trace.axd文件。然后在需要时加载该usercontrol

我有一个有效的解决方案,有两个警告:

首先,它总是过早地呈现跟踪输出,因为在重写中这样做太晚了(响应对象已经被清除),所以我们不得不在呈现阶段进行渲染,这意味着我们将错过一些消息(最明显的是
EndRender

在控件中实现该行为会加剧问题,因为我们必须确保控件是页面上最后呈现的内容,以避免丢失更多消息。出于这个原因,我选择实现一个自定义页面类而不是自定义控件类。如果您确实需要一个控件类,它应该很容易转换(但是如果您需要帮助,请在这里给我留言)

其次,拥有数据的探查器对象,
HttpRuntime.Profile
,对于
System.Web
程序集是
内部的
,当然,跟踪呈现例程对于
页面
类是
私有的。所以我们必须滥用反射,破坏封装,基本上是邪恶的,以便做你想做的事。如果ASP.NET跟踪实现有一点点变化,我们就完蛋了

也就是说,下面是可跟踪页面类:

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

namespace StackOverflow.Bounties.Web.UI
{
    public class TraceablePage : Page
    {
        /// <summary>
        /// Gets or sets whether to render trace output.
        /// </summary>
        public bool EnableTraceOutput
        {
            get;
            set;
        }

        /// <summary>
        /// Abuses reflection to force the profiler's page output flag
        /// to true during a call to the page's trace rendering routine.
        /// </summary>
        protected override void Render(HtmlTextWriter writer)
        {
            base.Render(writer);
            if (!EnableTraceOutput) {
                return;
            }

            // Allow access to private and internal members.
            BindingFlags evilFlags
                = BindingFlags.Instance | BindingFlags.Static
                | BindingFlags.Public | BindingFlags.NonPublic;

            // Profiler profiler = HttpRuntime.Profile;
            object profiler = typeof(HttpRuntime)
                .GetProperty("Profile", evilFlags).GetGetMethod(true)
                .Invoke(null, null);

            // profiler.PageOutput = true;
            profiler.GetType().GetProperty("PageOutput", evilFlags)
                .GetSetMethod(true).Invoke(profiler, new object[] { true });

            // this.ProcessRequestEndTrace();
            typeof(Page).GetMethod("ProcessRequestEndTrace", evilFlags)
                .Invoke(this, null);

            // profiler.PageOutput = false;
            profiler.GetType().GetProperty("PageOutput", evilFlags)
                .GetSetMethod(true).Invoke(profiler, new object[] { false });
        }
    }
}
以及背后的代码:

using System;
using System.Web.UI;

namespace StackOverflow.Bounties.Web.UI
{
    public partial class TestTracePage : TraceablePage
    {
        protected void enableTrace_CheckedChanged(object sender, EventArgs e)
        {
            EnableTraceOutput = enableTrace.Checked;
        }
    }
}
测试页面在第一次加载时呈现如下所示:

选中该框将发回并呈现跟踪输出:


如预期的那样,清除该复选框将再次抑制跟踪输出。

您的意思是整个请求详细信息表,与trace.axd输出它们完全相同吗?这与在
web.config
文件中使用
有什么不同?出于某些原因,我们不能将其添加到页面中。谁能看到跟踪需要控制。因此,我已将所有输出设置为WebGetRace,但希望控制输出。无论何时对页面启用跟踪,ASP.NET都会显示跟踪消息。(
trace.axd TraceViewer
)要将跟踪消息路由到ASP.NET网页,必须添加
WebGetRaceListener
对象。要在ASP.NET页面外部的上下文中查看ASP.NET和System.Diagnostics跟踪消息,请使用
TextWriterTraceListener
对象将跟踪消息写入文件。
using System;
using System.Web.UI;

namespace StackOverflow.Bounties.Web.UI
{
    public partial class TestTracePage : TraceablePage
    {
        protected void enableTrace_CheckedChanged(object sender, EventArgs e)
        {
            EnableTraceOutput = enableTrace.Checked;
        }
    }
}