2009-03-24 13 views
42

मेरा एक अनुरोध है कि एक संकुचित प्रतिक्रियाक्या .NET के HttpWebResponse स्वचालित रूप से GZiped और Deflated प्रतिक्रियाओं को असम्पीडित करता है?

var request = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate"); 

मुझे आश्चर्य है अगर जब मैं दूसरी पंक्ति जोड़ने मैं मैन्युअल विसंपीड़न को संभालने के लिए होगा स्वीकार करता है क्या करने के लिए कोशिश कर रहा हूँ।

+0

मुझे लगता है कि रिक Strahl गलत होना चाहिए: के रूप में वहाँ (लेखन के रूप में) एक संपत्ति AutomaticCompression निम्नलिखित GET उदाहरण पर विचार नहीं है एक GZipStream की जरूरत है। क्या आपने इसे स्वयं की कोशिश की है? – Keltex

+0

धन्यवाद - बस चीजों को समझने की कोशिश कर रहा है, क्या आप मुझे बता सकते हैं कि यह सही है या नहीं? (ए) यदि आप इस "AcceptEncoding" लाइन को नहीं जोड़ते हैं - यदि आप एक गैर-संपीड़ित फ़ाइल डाउनलोड करते हैं => ठीक है - यदि आप एक संपीड़ित फ़ाइल => ISSUE डाउनलोड करते हैं (फ़ाइल डाउनलोड करेंगे लेकिन भ्रष्ट दिखाई देंगे, असम्पीडित नहीं था) (बी) यदि आप इसे "AcceptEncoding" लाइन जोड़ते हैं तो: - यदि आप एक गैर-संपीड़ित फ़ाइल डाउनलोड करते हैं => अभी भी ठीक काम करता है - यदि आप एक संपीड़ित फ़ाइल => ठीक काम करते हैं (होगा असम्पीडित) क्या यह सही है? – Greg

+1

@ ग्रेग कोई भी विकल्प नहीं। दूसरी पंक्ति उन फ़ाइलों को डाउनलोड करने के बारे में नहीं है जो शायद पहले से संपीड़ित (यानी ज़िप फ़ाइलें) हैं, लेकिन वेब संसाधनों को डाउनलोड करने के बारे में जो ऑन-डिमांड (यानी एचटीएमएल फाइल) पर संपीड़ित हो सकते हैं। यदि आप दूसरी पंक्ति नहीं डालते हैं, तो एक अच्छी तरह से व्यवहार किया गया वेब सर्वर आपको संकुचित फ़ाइलों को बिल्कुल नहीं भेजेगा। यदि वेब सर्वर में फ़ाइलों को संपीड़ित करने की क्षमता है तो यह केवल तभी होगा जब आप दूसरी पंक्ति डालते हैं। –

उत्तर

102

मुझे जवाब मिला।

आप के लिए कोड बदल सकते हैं:

var request = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 

और आप स्वत: विसंपीड़न होगा। शेष कोड को बदलने की जरूरत नहीं है।

+2

अच्छा जवाब, मुझे बहुत मदद की :) –

+5

तकनीकी रूप से आपको केवल एक पंक्ति, "स्वचालित डिकंप्रेशन" की आवश्यकता है। ऐसा लगता है कि हेडर को स्वचालित रूप से "gzip, deflate" जोड़ना लगता है। – LongZheng

+0

बिल्कुल सही काम किया! बहुत धन्यवाद! –

-3

मुझे लगता है कि आपको स्वयं स्ट्रीम को डिकंप्रेस करना है। यहाँ यह कैसे करना है पर एक लेख है:

http://www.west-wind.com/WebLog/posts/102969.aspx

+0

नीचे दिए गए मेरे उत्तर को देखें –

+0

अच्छा खोज। ऐसा लगता है कि यह .NET 2.0 में जोड़ा गया था। हो सकता है कि स्ट्राल ने अपना लेख लिखा था, तो इसका उपयोग 1.1 – Keltex

+0

पर किया गया था जिसका उपयोग HttpWebRequest.AutomaticDecompression स्वचालित अनुरोध हेडर जोड़ता है और डिकंप्रेशन को संभालता है। – Armbrat

-2

GZIP और कम करें प्रतिक्रियाओं को स्वत: नियंत्रित नहीं कर रहे हैं। विवरण के लिए यह आलेख देखें: HttpWebRequest and GZip Http Responses

+0

यह सच नहीं है। – Armbrat

+0

क्षमा करें, मैं इसे एचटीपी लिस्टनर के अनुरोध और प्रतिक्रिया कक्षाओं के साथ मिला रहा था। .Net में मानक वेब अनुरोध वास्तव में संपीड़ित प्रतिक्रियाओं को संभालता है। –

0

.NET कोर चीजों के लिए थोड़ा अधिक शामिल हैं।

var req = WebRequest.CreateHttp(uri); 

/* 
* Headers 
*/ 
req.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate"; 

/* 
* Execute 
*/ 
try 
{ 
    using (var resp = await req.GetResponseAsync()) 
    { 
     using (var str = resp.GetResponseStream()) 
     using (var gsr = new GZipStream(str, CompressionMode.Decompress)) 
     using (var sr = new StreamReader(gsr)) 

     { 
      string s = await sr.ReadToEndAsync(); 
     } 
    } 
} 
catch (WebException ex) 
{ 
    using (HttpWebResponse response = (HttpWebResponse)ex.Response) 
    { 
     using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
     { 
      string respStr = sr.ReadToEnd(); 
      int statusCode = (int)response.StatusCode; 

      string errorMsh = $"Request ({url}) failed ({statusCode}) on, with error: {respStr}"; 
     } 
    } 
} 
संबंधित मुद्दे

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