重定向Trace.axd输出

时间:2010-10-04 14:59:47

标签: 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=b03f5f7f11d50a3a" 
</listeners>

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

1 个答案:

答案 0 :(得分:3)

我有一个有效的解决方案,有两点需要注意:

首先,它总是过早地渲染跟踪输出,因为在Page.ProcessRequest()覆盖中执行该操作为时已晚(Response对象已被清除),因此我们被迫在Render阶段执行此操作,这意味着我们会遗漏一些消息(最值得注意的是EndRender)。

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

其次,拥有数据HttpRuntime.Profile的探查器对象internalSystem.Web程序集,当然跟踪渲染例程private到{ {1}}课程。所以我们必须滥用反射,打破封装,基本上是 evil 才能做你想做的事。如果ASP.NET跟踪实现稍有改变,我们就是SOL。

那就是说,这是可追踪的页面类:

Page

这是它的测试页面,它使用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 }); } } } 复选框来演示其在回发中的行为:

AutoPostBack

背后的代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestTracePage.aspx.cs"
    Inherits="StackOverflow.Bounties.Web.UI.TestTracePage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>TraceablePage Test</title>
</head>
<body>
    <form id="form" runat="server">
    <h2>TraceablePage Test</h2>
    <p>
        <asp:CheckBox id="enableTrace" runat="server"
            AutoPostBack="True" Text="Enable trace output"
            OnCheckedChanged="enableTrace_CheckedChanged" />
    </p>
    </form>
</body>
</html>

测试页在第一次加载时呈现如下:

Trace disabled

检查框回发并渲染跟踪输出:

Trace enabled

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