C# 重定向Trace.axd输出
我有一个自定义控件,它只显示一组给定的配置值 我想捕获trace.axd数据并将其输出到此控件 web.configC# 重定向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
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;
}
}
}