2012-10-03 20 views
7

एक हब के लिए एक SignalR ग्राहक को विकसित करने में कुछ समस्या होने wth asp.net वेबसाइट में होस्ट gzip संपीड़न के साथ सक्षम होना चाहिए। चूंकि हम आईआईएस संपीड़न का उपयोग कर रहे हैं, सिग्नलआर की प्रतिक्रिया भी संपीड़ित हो जाती है, लेकिन, ग्राहक प्रतिक्रिया को समझ नहीं पाता है और हमें क्लाइंट पक्ष पर जेसन पार्सिंग त्रुटि मिलती है।SignalR gzip संपीड़न

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

मैंने सोचा कि मैं IHttpClient के अपने कस्टम कार्यान्वयन के साथ HubConnection.Start प्रदान करके HttpWebRequest तक पहुँच प्राप्त करने में सक्षम होना चाहिए, IHttpClient.GetAsync एक prepareRequest कार्रवाई जो मैंने सोचा था कि मुझे HttpWebRequest के लिए उपयोग देना चाहिए लेता है, लेकिन, HttpHelper.GetAsyncHttpWebRequestHttpWebRequestWrapper साथ लपेटता prepareRequest और HttpWebRequestWrapper पर जाने से पहले HttpWebRequest तक पहुंच प्रदान नहीं करता है।

HttpHelper कक्षा आंतरिक है इसलिए इसका भी उपयोग नहीं कर सकता है, इसलिए, मुझे बिल्कुल यकीन नहीं है कि सिग्नल के साथ स्वचालित डिकंप्रेशन को कैसे सक्षम किया जाए।

मैं HttpWebRequestHttpWebRequestWrapper में खुलासा कर सकता हूं, लेकिन यदि कोई मौजूद है तो एक आसान समाधान पसंद करेंगे। कोई भी तूफान?

मैं SignalR संस्करण का उपयोग कर रहा 0.5.1.10822

मेरे ऑटो विसंपीड़न HttpClient:

public class HttpClientWithAutoDecompression : IHttpClient 
{ 
    readonly DefaultHttpClient _httpClient = new DefaultHttpClient(); 

    private readonly DecompressionMethods _decompressionMethods; 
    public HttpClientWithAutoDecompression(DecompressionMethods decompressionMethods) 
    { 
     _decompressionMethods = decompressionMethods; 
    } 

    public Task<IResponse> GetAsync(string url, Action<IRequest> prepareRequest) 
    { 
     Task<IResponse> task = _httpClient.GetAsync(url, 
      request => 
       { 
        [ERROR: request is actually HttpRequestWrapper and 
        does not expose HttpWebRequest]**    ] 
        var httpWebRequest = (HttpWebRequest) request; 
        httpWebRequest.AutomaticDecompression = _decompressionMethods; 
        prepareRequest(request); 
       }); 

     return task.ContinueWith(response => 
     { 
      Log.Debug(this, "Response: {0}", response.Result.ReadAsString()); 
      return response.Result; 
     }); 

    } 
.... 
} 
+0

मैं अब भी gzip संपीड़न सक्षम है और पता चला कि SignalR.Client नहीं Accept-Encoding भेजता है कि एक सर्वर पर देख लिया है। ऐसा प्रतीत होता है कि या तो आपका क्लाइंट गलत तरीके से स्वीकृति-एन्कोडिंग हेडर भेजता है या आपके सेवर को gzip (जो अंतर्निहित आईआईएस संपीड़न नहीं करता) को हर प्रतिक्रिया देता है। क्या आप फिडलर के साथ जांच कर सकते हैं कि क्या हो रहा है? –

उत्तर

9
मेरी जानकारी GZip एन्कोडिंग और स्ट्रीमिंग का सबसे अच्छा करने के लिए

मिश्रण नहीं है। हमेशा के लिए फ्रेम परिवहन के मामले में ग्राहक पूरी प्रतिक्रिया तक स्ट्रीमिंग सामग्री पर किसी भी को डीकोड करने में सक्षम नहीं होगा, या कम से कम डेटा का एक महत्वपूर्ण ब्लॉक प्राप्त होगा (जिस तरह से डेटा डीकोड किया गया है)। वेब सॉकेट के मामले में इस समय किसी भी प्रकार के एन्कोडिंग के लिए समर्थन नहीं है, हालांकि स्पष्ट रूप से प्रति संदेश एन्कोडिंग being worked on के लिए विनिर्देश का विस्तार है।

यह कहा गया कि, यदि आप लॉन्गपॉलिंग परिवहन के लिए समर्थन प्रदान करने का प्रयास करना चाहते हैं, तो मैं इसे संभवतः देख सकता हूं कि आपका खुद का सिग्नल IHttpClient कार्यान्वयन प्रदान करना है। आप अभी देख सकते हैं कि DefaultHttpClient कक्षा HttpHelper::GetAsync का उपयोग करती है जो HttpWebRequest आंतरिक रूप से बनाती है और आप उस पर अपना हाथ कभी नहीं प्राप्त कर सकते हैं क्योंकि आपके पास केवल IRequest तक पहुंच है जो उस समय HttpWebRequestWrapper है।

अपनी खुद की IHttpClient बनाकर आप, HttpWebRequest की प्रारंभिक इन्स्टेन्शियशन अपने हाथ में लेने AutomaticDecompression सेट करें और फिर अपने आप को कि लपेटो अप HttpWebRequestWrapper साथ कर सकते हैं। डिफ़ॉल्ट रूप से, तो अपने सर्वर एक असम्पीडित संदेश के साथ प्रतिक्रिया और सब कुछ उम्मीद के रूप में काम करता है gzip:

+1

लेकिन इसे लंबे समय तक चलने वाले परिवहन के साथ काम करना चाहिए, क्योंकि ग्राहक को संदेश लौटने पर लंबे समय तक चलने का अनुरोध पूरा हो जाता है, या क्या मुझे कुछ याद आ रहा है? –

+0

धन्यवाद हू, मैं समझता हूं कि संपीड़न स्ट्रीमिंग के साथ क्यों काम नहीं करेगा, मुझे लगता है कि मेरी मुख्य समस्या यह थी कि सिंगनल आर एपी इंटरफ़ेस आपको एचटीपीवेबआरक्वेट तक पहुंच नहीं देता है जिसका उपयोग यह अनुरोध करने के लिए किया जाता है, मूल रूप से मैं ' httpWebRequest.AutomaticDecompression' प्रॉपर्टी, लेकिन, सिग्नलर एक रैपर में 'httpWebRequest' को लपेटता है जो स्वचालित डिकंप्रेशन संपत्ति का पर्दाफाश नहीं करता है। dfowler ने सुझाव दिया कि मैं रैपर वर्ग को संशोधित करता हूं और सिग्नलआर का पुनर्निर्माण करता हूं। अभी के लिए मैं केवल उस निजी संपत्ति तक पहुंचने के लिए प्रतिबिंब का उपयोग कर रहा हूं जिसकी मुझे आवश्यकता है। –

+0

@akoeplinger हाँ, इसे एलपी परिवहन के साथ काम करना चाहिए। निस्संदेह यह दक्षता के अनुसार उपयोग करने का सबसे खराब परिवहन है, इसलिए यह संभवतः जीजीआईपी के संभावित लाभ को अस्वीकार करता है जब तक कि आपका संदेश पेलोड बड़ा न हो। –

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