2008-12-22 16 views
17

Bir aspx sayfası tarafından oluşturulan HTML'yi (günlüğümde günlüğe kaydederken) en iyi nasıl yakalarım?ASP.NET'ten Oluşturulmuş HTML'yi Yakalama

Site düzenimi bozduğu için Response.Write'i kullanarak sayfaya geri yazmak zorunda kalmak istemiyorum. Response.OutputStream veya bir ArgumentException içinde Response.Output en akışı sonuçlarını (. {System.ArgumentException: Akış okunabilir değildi) kullanarak

+0

Kısaca yazmak için sayfa için Render yöntemini geçersiz kılın. Benzer soru ve cevaplar [burada] (http://stackoverflow.com/questions/56279/export-aspx-to-html) –

cevap

23

İyi bir soru, anlattığınız şeyi yapmak için bir HttpModule oluşturup oluşturamayacağımı denemeliydim.

Yanıt akışından okumaya çalışırken hiç şansım olmadı, ancak ResponseFilter'i kullanmak bana içeriği yakalamanın bir yolunu verdi.

Aşağıdaki kod oldukça iyi çalışıyor gibi görünüyor ve belki de kodu bir temel olarak kullanabileceğinizi düşündüm. Ama hatırla ki bu sadece hızlı bir şekilde bir araya getirdiğim bir şey, hiçbir şekilde test edilmedi. Bu nedenle, herhangi bir üretim ortamında uygun gözden geçirme/test yapmadan ve böyle kullanmayın. Bununla ilgili yorum yapmaktan çekinmeyin;)

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

bir yerde olduğu göz önüne alındığında kötü görünüyor http://stackoverflow.com/questions/1020045/how-to-trace-scriptservice-webservice-requests. Teşekkürler! – jrummell

+0

Filtreyi ayarlamak için BeginRequest olayını kullanmak zorunda kaldım, PreRequestHandlerExecute HttpModule'imde yanmadı. Nedenine bakmadım, ama belki başkalarına yardımcı olacak. – JeremyWeir

+0

Sorunun inanılmaz bir çözümü! –

4
oluşturulan HTTP yanıtları kaydeder, ancak ayı sağlayacak

Birçok yük test ASP.NET ile bu bazı çok büyük günlük dosyaları olabilir.

Düzeltme: Response.Filter'a göre Tom Jelen'in kodu, bu tür bir gözetim sağlamak için tasarlanmıştır ve Response.Outputstream, okunamaz durumda olabilir.

Düzenleme 2: bir sayfa yerine HttpModule'ü için

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() */ 

    //... 

} 

ve Page_Load

(veya tepki yine yazılmadan önce) sunucu tarafı XMLHTTP yapmak için

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

Response.OutputStream veya Response.Output akışını kullanmak bir ArgumentException ({System.ArgumentException: Stream) sonucunu verir. okunamazdı.) – lastas

+0

İlk önce sıfıra mı gittiniz? Okunabilir bir Memnuniyete Yazılsın mı? (Sadece VS kendimi yakıyorum şimdi nasıl yapılacağını bilmek istiyorum) – annakata

+0

Heh, ben sadece yazılan tüm Response.Filter kodu göndermek üzereydim ve Tom Jelen'in tam olarak bunu yaptı. Benim için de çok çalıştı :) – annakata

1

Tek yön kendi sunucunuza istek. Sonucu alın ve bir dosyaya veya DB'ye kaydedin.

Alternatif olarak, istemcideki AJAX kullanabilir, sonucu yakalayabilir ve sunucuya geri gönderebilirsiniz.

+2

istekleri iki katına çıkaran veri ilk bakışta – annakata