2010-05-07 12 views
5

ऐसा करने के लिए एक आसान तरीका हो सकता है, लेकिन मैं इसे नहीं देख सकते ...मैं कहीं भी प्रतिक्रिया स्ट्रीम में स्ट्रिंग कैसे डाल सकता हूं?

मैं एक सरल HTTP मॉड्यूल कि PreRequestHandler पर एक टाइमर शुरू होता है और PostRequestHandler पर टाइमर समय की गणना करने बंद हो जाता है बनाया यह पृष्ठ लोड करने के लिए लिया।

मैं फिर कुछ सरल HTML बना देता हूं और Response.Write पर अपने परिणाम लिखता हूं। चूंकि मैं PostRequestHandler में ऐसा कर रहा हूं, यह </html> टैग के बाद मेरे परिणाम जोड़ रहा है। परीक्षण के लिए यह ठीक है लेकिन मुझे ऐसे परिदृश्य में आवश्यकता है जहां पृष्ठ को सत्यापित करने की आवश्यकता है।

मुझे यह पता लगाना प्रतीत नहीं होता कि मैं </body> टैग से पहले अपने परिणामों को सम्मिलित करने के लिए प्रतिक्रिया ऑब्जेक्ट का उपयोग कैसे कर सकता हूं। Response.Write और Response.Output.Write में उस लचीलापन नहीं है और मैं एक स्ट्रिंग के रूप में प्रतिक्रिया के साथ काम करने का कोई तरीका नहीं देख सका। क्या मुझे कुछ आसान याद आ रही है?

उत्तर

8

ऐसा करने के लिए, आपको अपनी स्ट्रीम ऑब्जेक्ट को कार्यान्वित करना होगा और अपनी प्रतिक्रिया के लिए फ़िल्टर के रूप में उपयोग करना होगा।

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);    
     } 
    } 
} 

फिर, अपने HttpModule में, तो आप इस अपने BeginRequest को जोड़ेंगे:

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

ठोस लग रहा है। मैं इसे एक भंवर दे दूंगा। धन्यवाद! –

+0

कोई समस्या नहीं है। मैंने अपनी पोस्ट संपादित की क्योंकि मैं इनपुट पैरामीटर और स्थानीय चर के रूप में 'बफर 'का उपयोग कर रहा था, इसलिए मैंने इसे बदल दिया। –

+0

ठीक है, इसलिए मैंने इसे लागू करने की कोशिश की और कुछ सड़क ब्लॉक में भाग गया ... आपके ओवरड्रिन "लिखने" विधि के अंत में आप "प्रतिक्रियास्ट्रीम। राइट (...)" कहां से प्रतिक्रिया प्राप्त कर रहे हैं? आप इसे कहीं भी पास या प्रारंभ नहीं करते हैं? –

संबंधित मुद्दे