2010-05-07 18 views
5

Có thể có một cách dễ dàng để thực hiện việc này nhưng tôi không thể nhìn thấy nó ...Làm cách nào để chèn chuỗi vào luồng phản hồi ở bất kỳ nơi nào tôi muốn?

Tôi đã tạo một Mô-đun Http đơn giản bắt đầu hẹn giờ trên PreRequestHandler và ngừng bộ hẹn giờ trên PostRequestHandler để tính toán thời gian đã tải trang.

Sau đó, tôi tạo một số html đơn giản và viết kết quả của mình vào Response.Write. Vì tôi đang làm điều này trong PostRequestHandler, nó thêm kết quả của tôi sau thẻ </html>. Đó là tốt để thử nghiệm nhưng tôi cần trong một kịch bản mà trang cần phải xác nhận.

Tôi không thể tìm ra cách tôi có thể thao tác đối tượng Phản hồi để chèn kết quả của mình trước thẻ </body>. Response.Write và Response.Output.Write không có tính linh hoạt đó và tôi không thể thấy cách làm việc với Phản hồi dưới dạng chuỗi. Tôi có thiếu cái gì đó dễ dàng không?

Trả lời

8

Để thực hiện việc này, bạn phải triển khai đối tượng luồng của riêng mình và sử dụng đối tượng đó làm bộ lọc cho phản hồi của bạn.

Đối isntance:

public class TimerStream : Stream 
{ 
    private Stream inner { get; set; } 
    private StringBuilder responseHtml; 

    public TimerStream(Stream inputStream) { 
     inner = inputStream; 
     responseHtml = new StringBuilder(); 
     // Setup your timer 
    } 

    /* Filter overrides should pass through to inner, all but Write */ 
    public override void Write(byte[] buffer, int offset, int count) 
    { 
     string bufferedHtml = System.Text.UTF8Encoding.UTF8.GetString (buffer, offset, count); 
     Regex endTag = new Regex ("</html>", RegexOptions.IgnoreCase); 

     if (!endTag.IsMatch (bufferedHtml)) 
     { 
      responseHtml.Append(bufferedHtml); 
     } 
     else 
     { 
      // insert timer html into buffer, then... 
      responseHtml.Append (bufferedHtml); 
      byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes (responseHtml.ToString());    
      inner.Write (data, 0, data.Length);    
     } 
    } 
} 

Sau đó, trong HttpModule của bạn, bạn muốn thêm video này vào BeginRequest của bạn:

// Change the Stream filter 
HttpResponse response = context.Response; 
response.Filter = new TimerStream(context.Response.Filter); 
+0

Trông rắn. Tôi sẽ cho nó một vòng xoáy. Cảm ơn! –

+0

Không sao cả. Tôi đã sửa bài viết của mình vì tôi đã sử dụng 'buffer' làm tham số đầu vào và một biến cục bộ, vì vậy tôi đã thay đổi nó. –

+0

Ok, vì vậy tôi đã cố gắng thực hiện điều này và chạy vào một vài khối đường ... ở cuối phương thức "Ghi" được ghi đè của bạn, bạn gọi "responseStream.Write (...)" bạn nhận phản hồi từ đâu? Bạn không vượt qua hoặc khởi tạo nó ở bất cứ đâu? –