सिल्वरलाइट में डब्ल्यूसीएफ को संपीड़न जोड़ने का सबसे आसान तरीका क्या है?

मेरे पास एक चांदी की रोशनी 2 बीटा 2 एप्लिकेशन है जो डब्ल्यूसीएफ वेब सेवा तक पहुंचता है। इस वजह से, यह वर्तमान में केवल बुनियादी एचटीपी बाध्यकारी का उपयोग कर सकता है। Webservice एक्सएमएल डेटा की काफी बड़ी मात्रा में वापस आ जाएगा। यह बैंडविड्थ उपयोग दृष्टिकोण से काफी अपर्याप्त लगता है, प्रतिक्रिया के रूप में, यदि ज़िप्ड किया गया है, तो 5 के कारक से छोटा होगा (मैंने वास्तव में एक txt फ़ाइल में प्रतिक्रिया चिपका दी और इसे ज़िपित किया।)।

अनुरोध में "स्वीकृति-एन्कोडिंग: gzip, deflate" है - क्या कोई तरीका है डब्ल्यूसीएफ सेवा gzip (या अन्यथा संपीड़ित) प्रतिक्रिया है?

मुझे यह लिंक मिला लेकिन यह निश्चित रूप से कार्यक्षमता के लिए थोड़ा जटिल लगता है जिसे आउट-ऑफ-द-बॉक्स IMHO को संभाला जाना चाहिए।

ठीक है - पहले मैंने System.IO.Compression का उपयोग जवाब के रूप में समाधान को चिह्नित किया क्योंकि मैं काम करने के लिए IIS7 गतिशील संपीड़न प्राप्त करने के लिए "प्रतीत नहीं" कर सकता था। खैर, जैसा कि यह पता चला है:

  1. IIS7 पर गतिशील संपीड़न साथ काम कर रहा था। यह सिर्फ इतना है कि आईई के लिए निखिल के वेब डेवलपर हेल्पर प्लगइन ने इसे काम नहीं दिखाया। मेरा अनुमान है कि चूंकि एसएल वेब ब्राउजर को वेब सेवा कॉल करता है, इसलिए ब्राउजर इसे "कवर के तहत" संभालता है और निखिल का टूल संपीड़ित प्रतिक्रिया को कभी नहीं देखता है। मैं फिडलर का उपयोग करके इसकी पुष्टि करने में सक्षम था जो ब्राउज़र एप्लिकेशन से बाहर यातायात पर नज़र रखता है। फिडलर में, प्रतिक्रिया वास्तव में, gzip संपीड़ित थी !!

  2. System.IO.Compression समाधान के साथ दूसरी समस्या यह है कि System.IO.Compression Silverlight CLR में मौजूद नहीं है।

तो मेरे परिप्रेक्ष्य से, सिल्वरलाइट में डब्ल्यूसीएफ संपीड़न को सक्षम करने का सबसे आसान तरीका आईआईएस 7 में गतिशील संपीड़न को सक्षम करना और बिल्कुल कोई कोड नहीं लिखना है।

0
ro fr bn
गतिशील संपीड़न केवल कुछ अनुरोधों के लिए काम करता है (यानी आईआईएस द्वारा समझा जाता है जिसे अक्सर कहा जाता है)। तो यह अच्छी सुविधा है लेकिन आप पर इसका नियंत्रण नहीं है। जब उपयोगकर्ता लॉग इन करता है तो मेरे पास वास्तव में बड़ी कॉल होती है लेकिन यह दिन में एक बार की तरह होती है। और यह संपीड़ित नहीं है।
जोड़ा लेखक Boppity Bop, स्रोत

4 उत्तर

हाल ही में डब्लूसीएफ परियोजना करते समय मुझे डब्ल्यूसीएफ को संपीड़न करने का मूल तरीका नहीं मिला। मैंने बस System.IO.Compression नामस्थान का उपयोग किया और एक त्वरित कंप्रेसर बनाया। यहां इस्तेमाल किया गया कोड है

public static class CompressedSerializer
{
    /// 
/// Decompresses the specified compressed data. ///
 
    /// 
    /// 
The compressed data.
    /// 
    public static T Decompress(byte[] compressedData) where T : class
    {
        T result = null;
        using (MemoryStream memory = new MemoryStream())
        {
            memory.Write(compressedData, 0, compressedData.Length);
            memory.Position = 0L;

            using (GZipStream zip= new GZipStream(memory, CompressionMode.Decompress, true))
            {
                zip.Flush();
                var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                result = formatter.Deserialize(zip) as T;
            }
        }

        return result;
    }

    /// 
/// Compresses the specified data. ///
 
    /// 
    /// 
The data.
    /// 
    public static byte[] Compress(T data)
    {
        byte[] result = null;
        using (MemoryStream memory = new MemoryStream())
        {
            using (GZipStream zip= new GZipStream(memory, CompressionMode.Compress, true))
            {
                var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                formatter.Serialize(zip, data);
            }

            result = memory.ToArray();
        }

        return result;
    }
}

तो मैंने अपनी सेवाओं को एक इनपुट के रूप में एक बाइट सरणी में ले लिया था, जैसे

void ReceiveData(byte[] data);

मेरे लिए अच्छा काम किया।

0
जोड़ा
ध्यान दें कि GZipStream सिल्वरलाइट 2 सीएलआर में उपलब्ध नहीं है। DimeBrain यहां SharpZipLib का कार्यान्वयन और कार्यान्वयन है: dimebrain.com/2008/06/compression- i-1.html
जोड़ा लेखक russau, स्रोत

यदि आप आईआईएस 7 का उपयोग कर रहे हैं, तो संपीड़न मॉड्यूल । यह आपको अपने सर्वर पर HTTP अनुरोधों के लिए संपीड़न कॉन्फ़िगर करने की अनुमति देता है।

0
जोड़ा
यहां कुछ चेतावनी: मेरा काम प्रॉक्सी स्वीकृति gzip शीर्षलेख को हटा देता है (wtf, right?)। और आप केवल ग्राहक को जा रहे डेटा को संपीड़ित कर रहे हैं।
जोड़ा लेखक russau, स्रोत

डब्ल्यूसीएफ के लिए डब्ल्यूएस-संपीड़न आपको बाध्यकारी पर संपीड़न को कॉन्फ़िगर करने की अनुमति देता है।

पाब्लो एम। सिब्रारो द्वारा डब्लूसीएफ के लिए डब्ल्यूएस-संपीड़न देखें

वैकल्पिक रूप से, माइक्रोस्कोफ्ट GZip एन्कोडर नमूना का प्रयास करें जो "एक एन्कोडर चैनल बनाता है आउटगोइंग डब्ल्यूसीएफ संदेशों को संपीड़ित करने के लिए System.IO.Compression.GZipStream क्लास का उपयोग करता है "

0
जोड़ा
एक चेतावनी यह है कि चांदी की रोशनी 2 डब्ल्यूएस-बाइंडिंग का समर्थन नहीं करती है, बस मूलभूत बाइंडिंग।
जोड़ा लेखक caryden, स्रोत

It should also be noted that you may need to add the mime type to applicationHost.config under section in addition to enabling compression for the site:


यदि कुछ गतिशील प्रतिक्रियाओं को संपीड़ित नहीं किया जा रहा है (और कुछ हैं) यह एक माइम प्रकार का मुद्दा हो सकता है। अनुरोध से जुड़े विशिष्टताओं को प्राप्त करने के लिए फिडलर का प्रयोग करें। असफल अनुरोध ट्रेसिंग यह निर्धारित करने में उपयोगी हो सकती है कि आईआईएस प्रतिक्रिया को संपीड़ित करने का प्रयास कर रहा है या नहीं। यदि संपीड़न सही तरीके से कॉन्फ़िगर किया गया है तो आपको ट्रेस आउटपुट के पूर्ण ट्रेस अनुभाग में NO_MATCHING_CONTENT_TYPE दिखाई देगा।

0
जोड़ा
वो मेरे लिए किया गया। हालांकि यह ध्यान दिया जाना चाहिए कि आपको इस सेटिंग को C: \ Windows \ System32 \ inetsrv \ config \ applicationHost.config फ़ाइल में सेट करना है क्योंकि web.config सेटिंग को अनदेखा किया गया है। एक बार मैंने इसे बदलकर तुरंत काम किया।
जोड़ा लेखक R4cOON, स्रोत