我有一个自定义控件,只显示一组给定的配置值。
我想捕获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。
答案 0 :(得分:3)
我有一个有效的解决方案,有两点需要注意:
首先,它总是过早地渲染跟踪输出,因为在Page.ProcessRequest()覆盖中执行该操作为时已晚(Response
对象已被清除),因此我们被迫在Render
阶段执行此操作,这意味着我们会遗漏一些消息(最值得注意的是EndRender
)。
在控件中实现该行为会加剧问题,因为我们必须确保我们的控件是在页面上呈现的最后一件事,以避免错过更多消息。出于这个原因,我选择实现自定义页面类而不是自定义控件类。如果你绝对需要一个控制类,它应该很容易转换(但如果你需要帮助,请在这里留言)。
其次,拥有数据HttpRuntime.Profile
的探查器对象internal
到System.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>
测试页在第一次加载时呈现如下:
检查框回发并渲染跟踪输出:
再次清除复选框会抑制跟踪输出,如预期的那样。