2009-11-16 13 views
24

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

आईआईएस पर, मैंने आईएसआई 6 जीजीआईपी सभी प्रतिक्रियाओं (जहां अनुरोध "स्वीकार्य-एन्कोडिंग: gzip, deflate") को .svc wcf सेवाओं द्वारा उत्सर्जित करने के तरीके पर निर्देशों का पालन किया है here

क्लाइंट पर, मैंने वेब अनुरोध में इस शीर्षलेख को इंजेक्ट करने के तरीके पर here और here निर्देशों का पालन किया है: "स्वीकृति-एन्कोडिंग: gzip, deflate"।

फिडलर 2 दिखाता है कि प्रतिक्रिया द्विआधारी है और सादा पुरानी एक्सएमएल नहीं है।

क्लाइंट एक अपवाद के साथ दुर्घटनाग्रस्त हो जाता है जो मूल रूप से कहता है कि कोई एक्सएमएल हेडर नहीं है, जो वास्तव में सत्य है।

मेरे आईसीलिएंट मैसेज इंस्पेक्टर में, ऐप AfterReceiveReply कहलाता है इससे पहले क्रैश हो जाता है।

कुछ आगे नोट:

(1) मैं WCF सेवा या ग्राहक को बदल नहीं सकते, क्योंकि वे एक 3 पार्टी द्वारा आपूर्ति की जाती है। हालांकि, अगर यह सही दिशा है तो मैं कॉन्फ़िगरेशन के माध्यम से व्यवहार और/या संदेश निरीक्षकों को जोड़ सकता हूं।

(2) मैं सिर्फ साबुन निकाय को संपीड़ित/असम्पीडित नहीं करना चाहता, बल्कि पूरा संदेश।

कोई विचार/समाधान?

* हल *

संभव नहीं इन लक्ष्यों को प्राप्त करने के लिए एक WCF विस्तार लिखने के लिए किया गया था। इसके बजाय मैं पीछा इस CodeProject article जो एक सहायक वर्ग की वकालत:

public class CompressibleHttpRequestCreator : IWebRequestCreate 
{ 
    public CompressibleHttpRequestCreator() 
    { 
    } 

    WebRequest IWebRequestCreate.Create(Uri uri) 
    { 
     HttpWebRequest httpWebRequest = 
      Activator.CreateInstance(typeof(HttpWebRequest), 
      BindingFlags.CreateInstance | BindingFlags.Public | 
      BindingFlags.NonPublic | BindingFlags.Instance, 
      null, new object[] { uri, null }, null) as HttpWebRequest; 

     if (httpWebRequest == null) 
     { 
      return null; 
     } 

     httpWebRequest.AutomaticDecompression =DecompressionMethods.GZip | 
      DecompressionMethods.Deflate; 

     return httpWebRequest; 
    } 
} 

और भी आवेदन विन्यास फाइल करने के लिए एक अतिरिक्त:

<configuration> 
    <system.net> 
    <webRequestModules> 
     <remove prefix="http:"/> 
     <add prefix="http:" 
      type="Pajocomo.Net.CompressibleHttpRequestCreator, Pajocomo" /> 
    </webRequestModules> 
    </system.net> 
</configuration> 

क्या हो रहा प्रतीत हो रहा है है कि WCF अंत में कुछ कारखाने पूछता है या एक HttpWebRequest उदाहरण प्रदान करने के लिए system.net में गहराई से, और हम सहायक प्रदान करते हैं जिसे आवश्यक उदाहरण बनाने के लिए कहा जाएगा।

डब्ल्यूसीएफ क्लाइंट कॉन्फ़िगरेशन फ़ाइल में, किसी भी कस्टम एक्सटेंशन की आवश्यकता के बिना, एक साधारण मूल एचटीपी बाइंडिंग आवश्यक है।

जब एप्लिकेशन चलता है, तो क्लाइंट एचटीपी अनुरोध में हेडर "एसेप्ट-एन्कोडिंग: gzip, डिफ्लेट" होता है, सर्वर एक gzipped वेब प्रतिक्रिया देता है, और क्लाइंट पारदर्शी रूप से डब्ल्यूसीएफ को सौंपने से पहले http प्रतिक्रिया को डिक्रप्रेस करता है।

जब मैंने वेब तकनीक पर इस तकनीक को लागू करने का प्रयास किया तो मैंने पाया कि यह काम नहीं करता है। यद्यपि सहायक वर्ग को उसी तरह निष्पादित किया गया था जब डब्लूसीएफ क्लाइंट द्वारा उपयोग किया गया था, http अनुरोध में "स्वीकृति-एन्कोडिंग: ..." हेडर शामिल नहीं था।

protected override System.Net.WebRequest GetWebRequest(Uri uri) 
{ 
    System.Net.HttpWebRequest rq = (System.Net.HttpWebRequest)base.GetWebRequest(uri); 
    rq.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
    return rq; 
} 

नोट यह मामला नहीं था कि चाहे CompressibleHttpRequestCreator और आवेदन कॉन्फ़िग फ़ाइल को अवरुद्ध कर रहे थे:

वेब सेवाओं के लिए यह काम करने के लिए, मैं वेब प्रॉक्सी वर्ग संपादित करें, और इस विधि को जोड़ने के लिए किया था वर्तमान या नहीं। वेब सेवाओं के लिए, केवल वेब सेवा प्रॉक्सी में GetWebRequest को ओवरराइड करना काम करता है।

+6

प्रश्न के भाग के बजाय अपने समाधान को उत्तर के रूप में क्यों पोस्ट न करें, तो आप इसे स्वीकार कर सकते हैं? –

+4

आप इस बात से क्या कहते हैं: "वेब सेवाओं के लिए यह काम करने के लिए, मुझे वेब प्रॉक्सी क्लास को संपादित करना था, और इस विधि को जोड़ना था:"? वेब प्रॉक्सी कक्षा क्या है ?? – Naor

उत्तर

1

Here's an answer I gave विषय पर एक और प्रश्न के लिए। उस खोज को एडीओ.NET डेटा सेवाओं के परिप्रेक्ष्य से पूछा गया था, लेकिन मेरा जवाब पूरी तरह से डब्ल्यूसीएफ के बारे में था।

2

आपके डब्ल्यूसीएफ टिप के लिए धन्यवाद! हम अपनी दुकान में सेवाओं के लिए आईआईएस संपीड़न को सक्षम करने जा रहे हैं, और मुझे आशा है कि आपका समाधान काम करेगा। "वेब सेवाओं के लिए यह काम करने के लिए" - क्या आपका मतलब पुराना स्कूल सोपहटप्रोटोकॉल क्लाइंट था? क्योंकि SoapHttpProtocol क्लास में एक अंतर्निहित EnableDecompression प्रॉपर्टी है, जो स्वचालित रूप से संपीड़न हेडर और प्रतिक्रिया हैंडलिंग को संभालेगी।

+0

जबकि ओपी उत्तर सीधे अपने प्रश्न कार्यों में प्रदान किया गया है, यह सबसे अच्छा और सही समाधान है। एक उत्तर के रूप में स्वीकार किया जाना चाहिए। यह बात बताने के लिए धन्यवाद! – Marek

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