gpt4 book ai didi

c# - 重定向 Trace.axd 输出

转载 作者:太空狗 更新时间:2023-10-29 23:34:52 25 4
gpt4 key购买 nike

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

我想捕获 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>

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

最佳答案

我有一个可行的解决方案,但有两个注意事项:

首先,它总是会过早地呈现跟踪输出,因为在 Page.ProcessRequest() 中这样做已经太晚了。 override(Response 对象已经被清除),所以我们不得不在 Render 阶段做它,这意味着我们会错过一些消息(最值得注意的是EndRender).

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

其次,拥有数据的探查器对象 HttpRuntime.ProfileSystem.Web 程序集的内部,当然跟踪呈现例程是 Page 类的 private。所以我们必须滥用反射,打破封装,基本上是邪恶的才能做你想做的事。如果 ASP.NET 跟踪实现有丝毫变化,我们就是 SOL。

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

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>

以及背后的代码:

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 disabled

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

Trace enabled

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

关于c# - 重定向 Trace.axd 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3856438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com