2010-10-04 71 views
5

Tôi có một điều khiển tùy chỉnh chỉ hiển thị với một tập hợp các giá trị cấu hình nhất định.Chuyển hướng đầu ra Trace.axd

Tôi muốn nắm bắt dữ liệu trace.axd và xuất dữ liệu đó vào điều khiển này.

web.config

writeToDiagnosticsTrace="true" 
... 
<listeners> 
name="WebPageTraceListener" 
    type="System.Web.WebPageTraceListener, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
</listeners> 

Tôi muốn để có thể tải các tập tin trace.axd trong một usercontrol. Sau đó, có usercontrol được nạp bất cứ khi nào cần thiết.

+0

Bạn có nghĩa là toàn bộ bảng chi tiết yêu cầu, chính xác như Trace.axd xuất chúng không? Làm thế nào mà có thể khác với việc sử dụng '' trong tệp 'web.config' của bạn? –

+0

Vì một số lý do nhất định, chúng tôi không thể thêm nó vào trang. Ai có thể thấy dấu vết cần được kiểm soát. Vì vậy, tôi đã đặt tất cả đầu ra cho webPageTrace, nhưng muốn kiểm soát đầu ra. – Arnej65

+0

*** https: //msdn.microsoft.com/en-us/library/b0ectfxd.aspx *** ASP.NET hiển thị thông báo theo dõi bất cứ khi nào truy tìm được bật cho một trang. ('trace.axd TraceViewer') Để định tuyến các thông điệp Trace đến một trang Web ASP.NET, bạn phải thêm một đối tượng' WebPageTraceListener'. Để xem các thông báo theo dõi ASP.NET và System.Diagnostics trong một ngữ cảnh bên ngoài một trang ASP.NET, hãy sử dụng đối tượng 'TextWriterTraceListener' để ghi các thông điệp theo dõi vào một tệp. – Kiquenet

Trả lời

3

Tôi có một giải pháp làm việc, với hai hãy cẩn thận:

Thứ nhất, nó sẽ luôn luôn làm cho dấu vết đầu ra quá sớm, bởi vì nó quá muộn để làm điều đó trong một override Page.ProcessRequest() (đối tượng Response đã được dọn dẹp), vì vậy chúng tôi buộc phải làm điều đó trong giai đoạn Render, có nghĩa là chúng tôi sẽ bỏ lỡ một số thông báo (đáng chú ý nhất là EndRender).

Thực hiện hành vi đó trong điều khiển làm trầm trọng thêm vấn đề, vì chúng tôi phải đảm bảo điều khiển của chúng tôi là điều cuối cùng hiển thị trên trang để tránh thiếu nhiều thư hơn. Vì lý do đó, tôi đã chọn triển khai một lớp trang tùy chỉnh thay vì một lớp điều khiển tùy chỉnh. Nếu bạn hoàn toàn cần một lớp kiểm soát, nó sẽ dễ dàng chuyển đổi (nhưng để lại cho tôi một từ ở đây nếu bạn cần trợ giúp).

Thứ hai, đối tượng profiler rằng sở hữu dữ liệu, HttpRuntime.Profile, là internal để lắp ráp System.Web, và tất nhiên là render thường xuyên theo dõi là private đến lớp Page. Vì vậy, chúng tôi phải lạm dụng phản ánh, đóng gói đóng gói và về cơ bản là ác để thực hiện những gì bạn muốn. Nếu việc thực hiện theo dõi ASP.NET thay đổi một chút, chúng ta là SOL.

Điều đó nói rằng, đây là lớp trang theo dõi:

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 }); 
     } 
    } 
} 

Và đây là trang thử nghiệm của mình, trong đó sử dụng một hộp AutoPostBack kiểm tra để chứng minh hành vi của nó trên postbacks:

<%@ 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> 

Và mã đằng sau :

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; 
     } 
    } 
} 

Trang thử nghiệm hiển thị như thế này trên loa đầu tiên d:

Trace disabled

Kiểm tra bài gửi hộp trở lại và ám chỉ rằng dấu vết đầu ra:

Trace enabled

Xoá hộp kiểm một lần nữa ngăn chặn các dấu vết đầu ra, như mong đợi.

Các vấn đề liên quan