【问题标题】:Read multipart/mixed in C# (.NET 4.0)在 C# (.NET 4.0) 中读取 multipart/mixed
【发布时间】:2014-09-09 07:58:18
【问题描述】:

我得到一个像这样的多部分/混合(带有一个 JSON 对象和一个文件),作为我调用 Web 服务时的响应:

"--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),然后使用 UTF-8 对其进行解码。这给了我上面的字符串。 问题是如何获取 JSON 并(更重要的是)保存文件

我尝试更改(因为它们用于 multipart/form-data 而不是 multipart/mixed)thisthis 但我无法获取文件,可能是因为它的 Content-Type 是 application/octet -流。这是什么不起作用,文件在 Windows 中显示为损坏/损坏:

// 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);

更新: 跟随 Anton Tykhyy 的回答(谢谢!),但是当

var multipart = await content.ReadAsMultipartAsync () ;

提供的“HttpContent”实例无效。它没有内容类型标头值。 “HttpContent”实例必须具有以“multipart/”开头的内容类型标头。

我尝试在之前添加这一行

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

但现在我遇到了另一个错误(我也不太明白)

提供的“HttpContent”实例无效。它没有带有“边界”参数的“多部分”内容类型标头。

更新 2: 找到了,我只需要这样做:

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

【问题讨论】:

    标签: c# multipart


    【解决方案1】:

    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) ;
    }
    

    这应该让你开始。

    【讨论】:

      【解决方案2】:

      我设法解决了我的问题(阅读多部分),但必须迁移到 .NET 4.5,如果有人知道更改才能在 .NET 4.0 中工作 (通过用我猜的其他东西替换“await”和“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);
          }
      

      【讨论】:

      • 最简单的方法就是将await 替换为.Result,尽管这会阻塞线程。您可以尝试使用 4.5 编译器来定位 .NET 4.0,因为虽然可以使用 .ContinueWith 手动编写等效于编译器生成的 async/await 的代码,但它很复杂且令人费解(这就是为什么将 async/await 添加到编译器中的原因) .
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 2018-12-01
      • 2014-10-31
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多