2008-12-22 9 views
17

Làm cách nào để nắm bắt tốt nhất HTML (trong trường hợp của tôi, để ghi nhật ký) được hiển thị bởi trang aspx?Chụp HTML được tạo từ ASP.NET

Tôi không muốn phải viết lại trang bằng cách sử dụng Response.Write, vì nó làm rối loạn bố cục trang web của tôi.

Sử dụng Response.OutputStream hoặc kết quả dòng Response.Output trong một ArgumentException ({System.ArgumentException:. Suối là không thể đọc được)

+0

Để viết ngắn gọn, hãy ghi đè lên phương pháp hiển thị cho trang. Câu hỏi và câu trả lời tương tự [ở đây] (http://stackoverflow.com/questions/56279/export-aspx-to-html) –

Trả lời

23

Câu hỏi hay, tôi phải thử và xem liệu tôi có thể tạo một HttpModule để làm những gì bạn mô tả không.

Tôi không có bất kỳ may mắn nào đang cố đọc từ hồi đáp, nhưng việc sử dụng ResponseFilter đã cho tôi một cách để nắm bắt nội dung.

Mã sau đây có vẻ hoạt động khá tốt và tôi có thể đoán rằng bạn có thể sử dụng mã làm cơ sở. Nhưng hãy nhớ điều này chỉ là một cái gì đó tôi đã ném cùng nhau nhanh chóng, nó đã không được thử nghiệm trong bất kỳ cách nào. Vì vậy, không sử dụng nó trong bất kỳ môi trường sản xuất mà không cần xem xét/kiểm tra thích hợp và như vậy. Hãy bình luận về nó mặc dù;)

public class ResponseLoggerModule : IHttpModule 
{ 
    private class ResponseCaptureStream : Stream 
    { 
     private readonly Stream _streamToCapture; 
     private readonly Encoding _responseEncoding; 

     private string _streamContent; 
     public string StreamContent 
     { 
      get { return _streamContent; } 
      private set 
      { 
       _streamContent = value; 
      } 
     } 

     public ResponseCaptureStream(Stream streamToCapture, Encoding responseEncoding) 
     { 
      _responseEncoding = responseEncoding; 
      _streamToCapture = streamToCapture; 

     } 

     public override bool CanRead 
     { 
      get { return _streamToCapture.CanRead; } 
     } 

     public override bool CanSeek 
     { 
      get { return _streamToCapture.CanSeek; } 
     } 

     public override bool CanWrite 
     { 
      get { return _streamToCapture.CanWrite; } 
     } 

     public override void Flush() 
     { 
      _streamToCapture.Flush(); 
     } 

     public override long Length 
     { 
      get { return _streamToCapture.Length; } 
     } 

     public override long Position 
     { 
      get 
      { 
       return _streamToCapture.Position; 
      } 
      set 
      { 
       _streamToCapture.Position = value; 
      } 
     } 

     public override int Read(byte[] buffer, int offset, int count) 
     { 
      return _streamToCapture.Read(buffer, offset, count); 
     } 

     public override long Seek(long offset, SeekOrigin origin) 
     { 
      return _streamToCapture.Seek(offset, origin); 
     } 

     public override void SetLength(long value) 
     { 
      _streamToCapture.SetLength(value); 
     } 

     public override void Write(byte[] buffer, int offset, int count) 
     { 
      _streamContent += _responseEncoding.GetString(buffer); 
      _streamToCapture.Write(buffer, offset, count); 
     } 

     public override void Close() 
     { 
      _streamToCapture.Close(); 
      base.Close(); 
     } 
    } 

    #region IHttpModule Members 

    private HttpApplication _context; 
    public void Dispose() 
    { 

    } 

    public void Init(HttpApplication context) 
    { 
     _context = context; 

     context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute); 
     context.PreSendRequestContent += new EventHandler(context_PreSendRequestContent); 
    } 

    void context_PreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     _context.Response.Filter = new ResponseCaptureStream(_context.Response.Filter, _context.Response.ContentEncoding); 
    } 

    void context_PreSendRequestContent(object sender, EventArgs e) 
    { 
     ResponseCaptureStream filter = _context.Response.Filter as ResponseCaptureStream; 

     if (filter != null) 
     { 
      string responseText = filter.StreamContent; 

      // Logging logic here 
     } 
    } 

    #endregion 
} 
+0

Đó chỉ là những gì tôi cần cho http://stackoverflow.com/questions/1020045/how-to-trace-scriptservice-webservice-requests. Cảm ơn! – jrummell

+0

Tôi đã phải sử dụng sự kiện BeginRequest để thiết lập bộ lọc, PreRequestHandlerExecute không kích hoạt trong HttpModule của tôi. Tôi không tìm hiểu tại sao, nhưng có lẽ điều đó sẽ giúp người khác. – JeremyWeir

+0

Giải pháp tuyệt vời của vấn đề! –

4

Nhiều thử nghiệm tải sẽ cho phép bạn ghi lại các phản ứng HTTP được tạo ra, nhưng ghi với ASP.NET có thể là một số tệp nhật ký rất lớn.

Chỉnh sửa: Phản hồi.Filter theo mã của Tom Jelen được thiết kế để cung cấp loại giám sát này và Response.Outputstream không thể đọc được.

Chỉnh sửa 2: Đối với một trang chứ không phải là một HTTPModule

public class ObserverStream : Stream 
{ 
    private byte[] buffer = null; 
    private Stream observed = null; 

    public ObserverStream (Stream s) 
    { 
    this.observed = s; 
    } 

    /* important method to extend #1 : capturing the data */ 
    public override void Write(byte[] buffer, int offset, int count) 
    { 
    this.observed.Write(buffer, offset, count); 
    this.buffer = buffer; //captured! 
    } 

    /* important method to extend #2 : doing something with the data */ 
    public override void Close() 
    { 
    //this.buffer available for logging here! 
    this.observed.Close(); 
    } 

    /* override all the other Stream methods/props with this.observed.method() */ 

    //... 

} 

và trong Page_Load của bạn (hoặc trước phản ứng của bạn được viết nào)

Response.Filter = new ObserverStream(Response.Filter); 
+0

Sử dụng kết quả luồng Response.OutputStream hoặc Response.Output trong một ArgumentException ({System.ArgumentException: Stream không thể đọc được.) – lastas

+0

Bạn đã tìm kiếm không trước? Viết cho một MemStream có thể đọc được? (chỉ cần bắn lên VS bản thân mình bây giờ gây ra tôi muốn biết làm thế nào để làm điều này) – annakata

+0

Heh, tôi đã chỉ về để đăng tất cả các mã Response.Filter tôi chỉ cần viết và tìm thấy Tom Jelen của thực hiện chính xác mà đã. Làm việc cho tôi quá cơ bản :) – annakata

1

Một cách để làm cho server-side XMLHTTP yêu cầu đến máy chủ của riêng bạn. Lấy kết quả và lưu nó vào một tập tin hoặc DB.

Hoặc bạn có thể sử dụng AJAX trên máy khách, lấy kết quả và POST nó trở lại máy chủ.

+2

tăng gấp đôi lên trên yêu cầu có vẻ xấu cho dữ liệu là có một nơi nào đó lần đầu tiên vòng – annakata