2013-11-27 8 views
8

मैं अपनी आरईएसटी सेवा (डब्ल्यूसीएफ/वेब एचटीपी बाइंडिंग का उपयोग करके निर्मित) का विस्तार करने की कोशिश कर रहा हूं ताकि ग्राहक gzipped डेटा अपलोड कर सकें। मुझे यकीन नहीं है कि इसे पूरा करने का सबसे अच्छा तरीका क्या है लेकिन मैंने सोचा था कि एक HTTP मॉड्यूल जोड़कर यह काफी आसान होगा जो डेटा को डिक्रॉप करेगा यदि आने वाले अनुरोध के लिए सामग्री-एन्कोडिंग gzip पर सेट है।क्या मैं एक HTTP मॉड्यूल का उपयोग कर आने वाले HTTP अनुरोध की सामग्री को बदल सकता हूं?

तो मैं एक वर्ग निम्नलिखित कार्यान्वयन के साथ IHttpModule से पाने बनाया:

private void OnBeginRequest(object sender, EventArgs e) 
    { 
    var app = (HttpApplication) sender; 
    var context = app.Context; 

    var contentEncoding = context.Request.Headers["Content-Encoding"]; 

    if (contentEncoding == "gzip") 
    { 
     // some debug code: 
     var decompressedStream = new GZipStream(context.Request.InputStream, CompressionMode.Decompress); 
     var memoryStream = new MemoryStream(); 
     decompressedStream.CopyTo(memoryStream); 
     memoryStream.Seek(0, SeekOrigin.Begin); 

     var streamReader = new StreamReader(memoryStream); 
     string msg = streamReader.ReadToEnd(); 

     context.Request.InputStream.Seek(0, SeekOrigin.Begin); 

     app.Request.Filter = //new TestFilterStream(app.Request.Filter); 
        new System.IO.Compression.GZipStream(
        app.Request.Filter, CompressionMode.Decompress); 
    } 

    } 

मुद्दा मैं देख रहा हूँ कि GZipStream विसंपीड़न वास्तव में प्रदर्शन किया कभी नहीं रहा है। मैंने पुष्टि की है कि आने वाला डेटा वास्तव में gzip'd है (msg-variable में उचित डेटा है)। मैंने उपरोक्त अपनी स्ट्रीम क्लास (टेस्टफिल्टरस्ट्रीम) बनाने की कोशिश की है और ऐप को असाइन किया है। रिवेस्ट.फिल्टर और मैंने पुष्टि की है कि धारा वर्ग पर कोई भी सदस्य वास्तव में एएसपी.NET द्वारा नहीं बुलाया जाता है। तो ऐसा लगता है कि फ़िल्टर निर्दिष्ट करना संभव है, उस फ़िल्टर का वास्तव में उपयोग नहीं किया जाता है।

HttpAplication.Request.Filter वास्तव में उपयोग नहीं किया जाता है?

+0

क्या आपने अपने अन्य डीबग कोड के बिना 'Request.Filter' सेट करने का प्रयास किया है? ऐसा हो सकता है कि आप पहले ही अनुरोध स्ट्रीम पढ़ चुके हैं, इसलिए यह उसके बाद फ़िल्टर को लागू नहीं करेगा। –

+0

मेरा मानना ​​है कि अनुरोध करने का कोई कारण नहीं है। Request.InputStream तलाश योग्य है। यह शायद नहीं है। अपने डीबग कोड को हटाने का प्रयास करें, वैसे भी यह गलत है (आपको स्मृति स्ट्रीम में कुछ भी लिखने से पहले डिकंप्रेस्डस्ट्रीम को बंद/फ्लश करना पड़ सकता है)। – Luaan

+1

कृपया समस्या को कम करें, क्योंकि यह आपके प्रश्न से स्पष्ट नहीं है जहां वास्तविक त्रुटि होती है और कब। क्या समस्या वास्तव में है कि 'जीजेपीस्ट्रीम' अंतर्निहित धारा नहीं पढ़ता है? 'ContentEncoding 'euqual' gzip "' है, क्या 'if' ब्लॉक में कोड कॉल किया जाता है? क्या आपने इस विधि को बुलाए जाने के पल को लॉग करने का प्रयास किया है? क्या आप भी सुनिश्चित हैं कि आपका मॉड्यूल लोड हो जाए? – CodeCaster

उत्तर

0

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

मुझे संदेह है कि कन्निस की टिप्पणी सही है। क्या आपने डीबग कोड के बिना कोशिश की है? अगर मैं HttpRequest स्रोत में खोदता हूं, तो मुझे एक वैरिएबल _rawContent बिल्कुल एक बार लिखा जा रहा है; उसी समय अनुरोध फ़िल्टर लागू होते हैं। उसके बाद _rawContent मान कैश हो जाता है, और कभी अपडेट नहीं किया जाता है (न ही फ़िल्टर को जोड़ा जाने पर रीसेट करें)।

तो अपने डीबग कोड में Request.InputStream को कॉल करके आप निश्चित रूप से बाद में अपने फ़िल्टर को लागू होने से रोक रहे हैं। अनुरोध पढ़ना। हेडर संग्रह कोई समस्या नहीं है।

  1. एक HttpModule
  2. Application_BeginRequest() के शुरू में यह निर्धारित करना (Global.asax)
एक ही परिणाम के साथ

दोनों (का उपयोग करना:

2

मैं दो तरीकों से अनुरोध फ़िल्टर स्थापित करने की कोशिश की वीएस2012 वेब प्रोजेक्ट + IISExpress):

  • यदि कोई इनपुट डेटा नहीं है (अनुरोध या समान प्राप्त करें), टी वह Filter.Read लागू नहीं है
  • वास्तविक डेटा के साथ एक पोस्ट के मामले में, फिल्टर निष्पादित किया जाता है और वेब सेवा फ़िल्टर किए गए डेटा
  • फ़िल्टर सेट किया गया है इससे पहले कि यहां तक ​​कि अगर मैं Request.InputStream से पढ़ा जाता है, मैं अभी भी फिल्टर मेरे सेवा कोड से ट्रिगर किया गया।

मैं Gzippet इनपुट के साथ परीक्षण का कोई आसान तरीका है, तो मैं प्रयास नहीं किया है, तो वास्तविक फिल्टर काम करता है। हालांकि, मुझे पता है कि यह ट्रिगर हो रहा है, क्योंकि मुझे GZipStream से त्रुटि प्राप्त होती है, जबकि यह इनपुट की तलाश करने का प्रयास करती है।

शायद आपके पास अन्य एचटीपी मॉड्यूल या फ़िल्टर हैं जो आपके इनपुट या नियंत्रण प्रवाह को बाधित करते हैं?

This post एक विधि आपसे मिलते-जुलते का प्रस्ताव, लेकिन यह भी निम्नलिखित है, जो कुछ दुष्प्रभाव पैदा किया जा सकता है (मेरे परीक्षण WCF का उपयोग नहीं कर रहे थे) कहा गया है:

"ऐसा लगता है कि इस दृष्टिकोण में एक समस्या को गति प्रदान डब्ल्यूसीएफ, डब्ल्यूसीएफ मूल सामग्री-लंबाई पर निर्भर करता है और डिकंप्रेसिंग के बाद प्राप्त मूल्य नहीं। "

0

क्या आपको यकीन है, कि आवेदन ही परेशान करना चाहिए? आमतौर पर होस्ट की प्रति कॉन्फ़िगरेशन (आईआईएस) को संभाला जाता है। इसलिए, मूल रूप से, जब आप स्वयं सेवा होस्ट करते हैं, तो आपको केवल कस्टम GZip समर्थन को लागू करने की आवश्यकता होती है। आप देख सकते हैं here

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

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