2010-11-11 5 views
13

को संपीड़ित करने के लिए मैं संकुचित डेटा स्वीकार करने वाले सर्वर पर डेटा पोस्ट करने का प्रयास कर रहा हूं। नीचे दिया गया कोड ठीक काम करता है, लेकिन यह असम्पीडित है। मैंने संपीड़न या Gzip beofre के साथ काम नहीं किया है, इसलिए किसी भी मदद की सराहना की है।एक HttpWebRequest POST

HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest; 
    request.Timeout = 600000; 
    request.Method = verb; // POST  
    request.Accept = "text/xml"; 

    if (!string.IsNullOrEmpty(data)) 
    { 
    request.ContentType = "text/xml";   

    byte[] byteData = UTF8Encoding.UTF8.GetBytes(data); 
    request.ContentLength = byteData.Length;  

    // Here is where I need to compress the above byte array using GZipStream 

    using (Stream postStream = request.GetRequestStream()) 
    { 
     postStream.Write(byteData, 0, byteData.Length);   
    } 
    }  

    XmlDocument xmlDoc = new XmlDocument(); 
    HttpWebResponse response = null; 
    StreamReader reader = null; 
    try 
    { 
    response = request.GetResponse() as HttpWebResponse; 
    reader = new StreamReader(response.GetResponseStream()); 
    xmlDoc.LoadXml(reader.ReadToEnd()); 
    } 

क्या मैं पूरे बाइट सरणी को गीज़िप करता हूं? क्या मुझे अन्य शीर्षलेख जोड़ने या पहले से मौजूद एक को हटाने की ज़रूरत है?

धन्यवाद!

स्कॉट

उत्तर

3

Page_Load घटना में:

 Response.AddHeader("Content-Encoding", "gzip"); 

और संकुचित अनुरोध करने के लिए: रिक Strahl द्वारा

HttpWebRequest and GZip Http Responses

+4

जुड़ा हुआ लेख बताता है एक जवाब में दिए गए डेटा को संपीड़ित करने के लिए कैसे, लेकिन अनुरोध संरचित करने के तरीके नहीं संकुचित डेटा का उपयोग कर। – Scott

+0

@ स्कॉट अपडेट किया गया। –

12

सवाल आपसे पूछा उत्तर देने के लिए, पोस्ट करने के लिए संपीड़ित डेटा, आपको बस इतना करना है कि अनुरोध स्ट्रीम को gzip stre के साथ लपेटें हूँ

using (Stream postStream = request.GetRequestStream()) 
{ 
    using(var zipStream = new GZipStream(postStream, CompressionMode.Compress)) 
    { 
     zipStream.Write(byteData, 0, byteData.Length);   
    } 
} 

यह एक जीजीआईपी प्रतिक्रिया का अनुरोध करने से बिल्कुल अलग है, जो करना बहुत आम बात है।

+3

यह जो कुछ मैं ढूंढ रहा हूं उसके करीब यह दिखता है। हालांकि, मुझे "सभी बाइट्स लिखे जाने तक स्ट्रीम स्ट्रीम को बंद नहीं किया जा सकता" अपवाद। अभी भी इसकी जांच कर रहा है। फ्लश() मदद करने के लिए प्रतीत नहीं होता है। इसके अलावा, मुझे यह जानने की ज़रूरत है कि इसके लिए हेडर का क्या उपयोग करना है। – Scott

+0

@ फिलीपोव [उत्तर] के साथ (http://stackoverflow.com/a/23055905/492258) यह पूरा उत्तर बन गया –

0

इस विस्तार विधि को आज़माएं। स्ट्रीम को छोड़ दिया जाएगा (GZipStream कन्स्ट्रक्टर देखें)। संपीड़न पूरा होने के बाद स्ट्रीम स्थिति 0 पर सेट की गई है। अधिक जानकारी के लिए

[Test] 
public void Test_gzip_data_is_restored_to_the_original_value() 
{ 
    var stream = new MemoryStream(); 
    var data = new byte[]{1,2,3,4,5,6,7,8,9,10}; 

    stream.GZip(data); 

    var decompressed = new GZipStream(stream, CompressionMode.Decompress); 

    var data2 = new byte[10]; 
    decompressed.Read(data2,0,10); 

    Assert.That(data, Is.EqualTo(data2)); 
} 

देखें::

public static void GZip(this Stream stream, byte[] data) 
{ 
    using (var zipStream = new GZipStream(stream, CompressionMode.Compress, true)) 
    { 
     zipStream.Write(data, 0, data.Length); 
    } 
    stream.Position = 0; 
} 

आप निम्न परीक्षण का उपयोग कर सकते http://msdn.microsoft.com/en-us/library/hh158301(v=vs.110).aspx

3

मैं भी प्राप्त "कर सकते हैं बंद नहीं धारा जब तक सभी बाइट्स लिखा जाता है" के समान कोड का उपयोग कर त्रुटि tnyfst की। समस्या यह थी कि मेरे पास था:

request.ContentLength = binData.Length; 

जहां संपीड़न से पहले बिनडाटा मेरा कच्चा डेटा है। जाहिर है संकुचित सामग्री की लंबाई अलग होगा, तो मैं बस इस लाइन हटा दिया और इस कोड के साथ समाप्त हो गया:

using (GZipStream zipStream = new GZipStream(request.GetRequestStream(), CompressionMode.Compress)) 
{ 
    zipStream.Write(binData, 0, binData.Length); 
}