2008-12-22 10 views
17

से उत्पन्न एचटीएमएल कैप्चरिंग मैं एएसपीएक्स-पेज द्वारा प्रस्तुत एचटीएमएल (मेरे उदाहरण में, लॉगिंग के लिए) को कैप्चर कैसे कर सकता हूं?एएसपी.नेट

मैं Response.Write का उपयोग कर पृष्ठ पर वापस लिखना नहीं चाहता, क्योंकि यह मेरी साइट लेआउट को गड़बड़ कर देता है।

Response.OutputStream या एक ArgumentException में Response.Output की धारा परिणाम ({System.ArgumentException।: स्ट्रीम पढ़ने योग्य नहीं था) का उपयोग करना

+0

इसे छोटा करने के लिए, पृष्ठ के लिए रेंडर विधि को ओवरराइड करें। इसी तरह के प्रश्न और उत्तर [यहां] (http://stackoverflow.com/questions/56279/export-aspx-to-html) –

उत्तर

23

अच्छा सवाल, मुझे यह देखने की कोशिश करनी थी कि क्या आप वर्णन कर रहे हैं कि मैं ऐसा करने के लिए एक HttpModule बना सकता हूं।

मेरे पास उत्तरदायित्व से पढ़ने की कोशिश करने वाला कोई भाग्य नहीं था, लेकिन ResponseFilter का उपयोग करके मुझे सामग्री को कैप्चर करने का एक तरीका मिला।

निम्नलिखित कोड बहुत अच्छा काम करता प्रतीत होता है, और मुझे लगता है कि आप आधार के रूप में कोड का उपयोग कर सकते हैं। लेकिन याद रखें कि यह सिर्फ कुछ है जो मैंने तेजी से फेंक दिया है, इसका परीक्षण किसी भी तरह से नहीं किया गया है। तो उचित समीक्षा/परीक्षण और ऐसे बिना किसी उत्पादन वातावरण में इसका उपयोग न करें। हालांकि इस पर टिप्पणी करने के लिए स्वतंत्र महसूस करें;)

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

है, यह वही है जो मुझे http://stackoverflow.com/questions/1020045/how-to-trace-scriptservice-webservice-requests के लिए आवश्यक है। धन्यवाद! – jrummell

+0

मुझे फिल्टर सेट अप करने के लिए BeginRequest ईवेंट का उपयोग करना पड़ा, PreRequestHandlerExecute मेरे HttpModule में आग नहीं लगा। मैंने क्यों नहीं देखा, लेकिन शायद वह किसी और की मदद करेगा। – JeremyWeir

+0

समस्या का अद्भुत समाधान! –

4

कई लोड परीक्षकों आप उत्पन्न HTTP प्रतिक्रियाओं प्रवेश करते है, लेकिन में रखना करने की अनुमति देगा एएसपी.नेट के साथ दिमाग उन कुछ बड़ी लॉग-फाइलें हो सकती है।

संपादित करें: प्रतिक्रिया। टिम जेलेन के कोड के अनुसार फ़िल्टर इस तरह की निगरानी और प्रतिक्रिया देने के लिए डिज़ाइन किया गया है। आउटपुटस्ट्रीम अन्यथा अपठनीय है।

संपादित करें 2: एक पेज के बजाय एक 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() */ 

    //... 

} 

और अपने Page_Load में (या आपकी प्रतिक्रिया वैसे भी लिखा है से पहले)

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

Response.OutputStream या Response.Output की स्ट्रीम का उपयोग एक ArgumentException ({System.ArgumentException: स्ट्रीम में परिणाम पठनीय नहीं था।) – lastas

+0

क्या आप पहले शून्य करना चाहते थे? एक पठनीय मेमस्ट्रीम को लिखें? (सिर्फ वीएस को फायरिंग कर रहा है क्योंकि अब मैं जानना चाहता हूं कि यह कैसे करें) – annakata

+0

हे, मैं बस सभी प्रतिक्रिया पोस्ट करने वाला था। फ़िल्टर कोड मैं अभी लिखा था और टॉम जेलेन ने पहले से ही ऐसा किया था। मेरे लिए भी मूल रूप से काम किया :) – annakata

1

एक तरह से सर्वर साइड XMLHTTP बनाने के लिए करने के लिए अपने सर्वर से अनुरोध करें। परिणाम प्राप्त करें और इसे एक फ़ाइल या डीबी में सहेजें।

वैकल्पिक रूप से आप क्लाइंट पर AJAX का उपयोग कर सकते हैं, परिणाम प्राप्त कर सकते हैं, और उसे सर्वर पर वापस पोस्ट कर सकते हैं।

+2

अनुरोधों पर दोगुना होना बुरा लगता है क्योंकि डेटा कहीं भी पहली बार – annakata