2014-07-18 8 views
5

मैं (JSON वस्तु और एक फ़ाइल के साथ) एक बहुखण्डीय/मिश्रित प्राप्त इस तरह में बहुखण्डीय/मिश्रित पढ़ें, प्रतिक्रिया के रूप में जब मैं एक वेब सेवा को कॉल:सी # (.NET 4.0)

"--Boundary_9_15033478_1405613164044\r\n 

Content-Type: application/json 
\r\n\r\n{\"docId\":9007492,\"protId\":200,\"protNum\":\"0002084B14\",\"protDate\":\"Wed Jul 16 00:00:00 EEST 2014\",\"categoryId\":1000,\"desc\":\"ѥⷞ ��ƣ䲜��",\"linkNum\":\"ư1\\/00005545\",\"flag1\":\"\",\"flag2\":\"\",\"flag3\":\"\",\"flag4\":\"\",\"stsId\":1,\"stsDesc\":\"WS04: Check Layer I - OK\",\"wsDataList\":[],\"fileName\":\"WsTestToolkitMain.jpg\"}\r\n--Boundary_9_15033478_1405613164044\r\n 

Content-Type: application/octet-stream 
\r\n\r\n????\0JFIF\0\0`\0`\0\0??\0C\0\a\a\a\a\a\a\b\t\v\t\b\b\n\b\a\a\n\r\n\n\v\f\f\f 
... 
... 
... 
??\n?$??\0???????\r\n--Boundary_9_15033478_1405613164044--\r\n" 

रास्ता मुझे यह प्रतिक्रिया मिली है (HttpWebRequest की) और फिर इसे यूटीएफ -8 के साथ डीकोड करें। यह मुझे उपरोक्त स्ट्रिंग देता है। प्रश्न मैं JSON कैसे प्राप्त कर सकता हूं और (अधिक महत्वपूर्ण रूप से) फ़ाइल सहेज सकता हूं?

मैं बदल रहा है की कोशिश की (क्योंकि वे बहुखण्डीय/फार्म-डेटा के लिए कर रहे हैं मिश्रित मल्टीपार्ट नहीं /) this और this लेकिन शायद क्योंकि इसकी सामग्री प्रकार आवेदन/ओकटेट धारा है मैं फ़ाइल नहीं मिल सकता है। यहाँ फ़ाइल प्रतीत होता है के रूप में यह क्षतिग्रस्त/खिड़कियों में दूषित काम नहीं करता क्या है,:

// Read the stream into a byte array 
byte[] data = ToByteArray(stream);//Source 
string content = encoding.GetString(data); 
int contentLength = content.Length;//Length 
byte[] fileData = new byte[contentLength];//Destination 
Buffer.BlockCopy(data, startIndex, fileData, 0, contentLength); 
this.FileContents = fileData; 
File.WriteAllBytes("G:\\" + parser.Filename, parser.FileContents); 

अद्यतन: (! धन्यवाद) एंटोन Tykhyy द्वारा जवाब पालन किया, लेकिन मैं एक त्रुटि जब

हो रही है
var multipart = await content.ReadAsMultipartAsync() ; 

अमान्य 'HttpContent' उदाहरण प्रदान किया गया। इसमें सामग्री-प्रकार हेडर मान नहीं है। 'HttpContent' उदाहरणों में 'मल्टीपार्ट /' से शुरू होने वाली सामग्री-प्रकार शीर्षलेख होना चाहिए।

मैंने पहले

content.Headers.Add("Content-Type", "multipart/mixed"); 

इस लाइन जोड़ने की कोशिश की लेकिन अब मैं (है कि मैं वास्तव में बहुत समझ में नहीं आता)

अमान्य अन्य त्रुटि प्रदान की 'HttpContent' उदाहरण हो रही है। इसमें 'सीमा' पैरामीटर के साथ 'मल्टीपार्ट' सामग्री-प्रकार शीर्षलेख नहीं है।

अद्यतन 2: मिले यह, मैं सिर्फ यह करना ही था:

var content = new StreamContent(httpResponse.GetResponseStream()); 
    content.Headers.Add("Content-Type", httpResponse.ContentType); 

उत्तर

4

System.Net.Http.Formatting assembly में उपयोग ReadAsMultipartAsync,

var content = new StreamContent (stream) ; 
var multipart = await content.ReadAsMultipartAsync() ; 
foreach (var part in multipart) 
{ 
    if (part.Headers.ContentType.MediaType == "application/json") 
    { 
     // deserialize via stream e.g. part.ReadAsStreamAsync() or via string 
     // using part.ReadAsStringAsync() to avoid charset grief 
    } 
    else 
    using (var file = File.Create (parser.Filename)) 
     await part.CopyToAsync (file) ; 
} 

की तर्ज पर यह चाहिए आप प्राप्त करने के लिए शुरू कर दिया है।

1

मैं मेरी समस्या (बहुखण्डीय है कि पढ़ने के लिए), का समाधान करने में कामयाब रहे लेकिन, .NET 4.5 को स्थानांतरित करने के लिए यदि किसी में .NET 4.0 (बदल कर "का इंतजार है" काम करने के लिए आदेश में परिवर्तन जानता था और मुझे लगता है कि कुछ और के साथ "async") मुझे पता होना अच्छा लगेगा। तो मैंने यही किया।

static void Main(string[] args) 
    { 

      //some code here... 

      // POST the request 
      var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
      Console.Write(httpResponse.GetResponseStream()); 
      readMultipart(httpResponse).Wait(); 
    } 

    async static Task readMultipart(HttpWebResponse httpResponse) 
    { 
     var content = new StreamContent(httpResponse.GetResponseStream()); 
     content.Headers.Add("Content-Type", httpResponse.ContentType); 
     var multipart = await content.ReadAsMultipartAsync(); 
     String filename = ""; 
     String json = await multipart.Contents[0].ReadAsStringAsync(); 
     JObject o = JObject.Parse(json); 
     filename = o["fileName"].ToString(); 
     using (var file = File.Create("C:\\testWS\\" + filename)) 
      await multipart.Contents[1].CopyToAsync(file); 
    } 
+1

सबसे आसान तरीका सिर्फ 'प्रतीक्षा' के साथ 'प्रतीक्षा' को प्रतिस्थापित करने के लिए है, हालांकि यह धागा को अवरुद्ध करता है। आप 4.5 कंपाइलर के साथ .NET 4.0 को लक्षित करने का प्रयास कर सकते हैं, क्योंकि संकलक-जेनरेट किए गए 'async/await' के समतुल्य कोड को मैन्युअल रूप से' .ContinueWith' का उपयोग करके लिखा जा सकता है, यह जटिल और संकलित है (यही कारण है कि 'async/await' था कंपाइलर में जोड़ा गया)। –