2009-09-04 25 views
9

Dưới đây là những gì tôi đang cố gắng thực hiện:Làm cách nào để truy xuất html phản hồi từ trong HttpModule?

Tôi đã viết một HttpModule để thực hiện theo dõi một số trang cụ thể. Một số trang .aspx cũ trên trang web của chúng tôi được mã hóa cứng mà không có điều khiển thực, nhưng chúng là tệp .aspx nên mô-đun của tôi vẫn chạy khi được yêu cầu.

Trình xử lý của mô-đun của tôi được đính kèm với PostRequestHandlerExecute, vì vậy tôi tin rằng những gì sẽ được gửi lại cho người yêu cầu đã được xác định.

Tôi cần có khả năng trích xuất bất kỳ chuỗi nào có trong thẻ tiêu đề.

Vì vậy, nếu

<title>Chunky Bacon</title> 

được gửi cho người yêu cầu trong HTML rendered thức. Sau đó, tôi muốn "Chunky Bacon".

Ý tưởng?

+0

ý của bạn là "trích xuất bất kỳ chuỗi nào trong thẻ"? Bạn đang cố gắng điều khiển phản hồi được gửi lại cho người yêu cầu? Nó không phải là rõ ràng những gì bạn đang cố gắng làm. – NerdFury

+0

xin lỗi, tôi quên rằng thẻ HTML của tôi sẽ không hiển thị trừ khi tôi đặt nó vào một khối mã. Tôi không cần thao tác phản hồi, chỉ cần trích xuất chuỗi bên trong thẻ tiêu đề. – spilliton

+0

Để làm rõ, bạn có đang cố gắng lấy nội dung từ phản hồi hoặc cố gắng phân tích cú pháp thẻ từ nội dung không? –

Trả lời

22

Thách thức nhỏ thú vị.

Dưới đây là các mã:

StreamWatcher.cs

public class StreamWatcher : Stream 
    { 
     private Stream _base; 
     private MemoryStream _memoryStream = new MemoryStream(); 

     public StreamWatcher(Stream stream) 
     { 
      _base = stream; 
     } 

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

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

     public override void Write(byte[] buffer, int offset, int count) 
     { 
      _memoryStream.Write(buffer, offset, count); 
      _base.Write(buffer, offset, count); 
     } 

     public override string ToString() 
     { 
      return Encoding.UTF8.GetString(_memoryStream.ToArray()); 
     } 

     #region Rest of the overrides 
     public override bool CanRead 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override bool CanSeek 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override bool CanWrite 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override long Seek(long offset, SeekOrigin origin) 
     { 
      throw new NotImplementedException(); 
     } 

     public override void SetLength(long value) 
     { 
      throw new NotImplementedException(); 
     } 

     public override long Length 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override long Position 
     { 
      get 
      { 
       throw new NotImplementedException(); 
      } 
      set 
      { 
       throw new NotImplementedException(); 
      } 
     } 
     #endregion 
    } 

TitleModule.cs

public class TitleModule : IHttpModule 
{ 
    public void Dispose() 
    { 
    } 

    private static Regex regex = new Regex(@"(?<=<title>)[\w\s\r\n]*?(?=</title)", RegexOptions.Compiled | RegexOptions.IgnoreCase); 
    private StreamWatcher _watcher; 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += (o, e) => 
     { 
      _watcher = new StreamWatcher(context.Response.Filter); 
      context.Response.Filter = _watcher; 
     }; 


     context.EndRequest += (o, e) => 
     { 
      string value = _watcher.ToString(); 
      Trace.WriteLine(regex.Match(value).Value.Trim()); 
     }; 
    } 
} 
+0

Làm như vậy, cảm ơn broseph! Tôi vẫn rất ngạc nhiên vì điều này cần nhiều dòng mã để thực hiện ... – spilliton

+0

Giải pháp tuyệt vời! – gljivar

+0

Với 4.6.1 AFAIK bạn phải triển khai các phương thức nâng cao NotImplementedException. Cách dễ nhất để làm điều này là tất nhiên để trì hoãn tất cả các cuộc gọi đến _memoryStream –

3

Có một bài viết về 4GuysFromRolla rằng cuộc đàm phán về việc tạo HttpResponse bộ lọc đó là về cơ bản luồng xử lý phản hồi trước passi ng nó qua luồng đầu ra cuối cùng (một máy đánh chặn).

http://aspnet.4guysfromrolla.com/articles/120308-1.aspx

+0

Thật tuyệt, tôi đọc một chút về những điều này trên google khi tìm kiếm giải pháp, có vẻ như mục đích chính của việc viết một trong số đó là thao tác HTML được gửi trước khi gửi. Vì tôi không thao túng và chỉ cần truy cập vào HTML, tôi đã tìm ra điều này sẽ là quá mức cần thiết, nhưng nếu đó là cách duy nhất ... – spilliton

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