如何在ASP.NET 2.1中解析API返回的multipart/form-data数据
在ASP.NET 2.1中解析multipart/form-data格式的API响应
multipart/form-data格式的响应由**边界符(boundary)**分隔多个独立内容块,每个块包含头部信息(如Content-Type、Content-Disposition)和实际内容。针对你的场景,响应包含JSON元数据和PDF标签文件两个块,以下是具体解析步骤:
1. 提取响应的边界符(Boundary)
首先从API响应的Content-Type头中获取边界符,它是分隔各个内容块的核心标识。示例中边界符为F77HAO7SxZC-Iy2+MKZ7pApb,代码提取方式如下:
var response = await httpClient.GetAsync("你的API接口地址"); var contentType = response.Content.Headers.ContentType; var boundary = contentType.Parameters.First(p => p.Name == "boundary").Value;
2. 使用MultipartMemoryStreamProvider解析响应
ASP.NET 2.1内置的MultipartMemoryStreamProvider类可自动处理multipart内容,将每个块读取到内存流中:
var provider = new MultipartMemoryStreamProvider(); await response.Content.ReadAsMultipartAsync(provider);
3. 处理各个内容块
遍历provider.Contents集合,通过Content-Disposition中的name属性区分内容类型:
3.1 解析JSON元数据(labelMetadata)
先定义匹配JSON结构的实体类(可根据实际字段补充):
public class LabelMetadata { public LabelAddress labelAddress { get; set; } public string routingInformation { get; set; } public string trackingNumber { get; set; } public decimal postage { get; set; } public Commitment commitment { get; set; } // 其他字段按需添加 } public class LabelAddress { public string streetAddress { get; set; } public string city { get; set; } public string state { get; set; } public string ZIPCode { get; set; } // 其他字段按需添加 } public class Commitment { public string name { get; set; } public string scheduleDeliveryDate { get; set; } }
读取对应块并反序列化:
var metadataContent = provider.Contents.First(c => c.Headers.ContentDisposition.Name.Equals("labelMetadata", StringComparison.OrdinalIgnoreCase)); var metadataJson = await metadataContent.ReadAsStringAsync(); var labelMetadata = JsonConvert.DeserializeObject<LabelMetadata>(metadataJson);
(注:ASP.NET 2.1默认集成Newtonsoft.Json,无需额外引用)
3.2 解析PDF标签文件(labelImage)
读取内容块的流并转换为字节数组,可直接保存为文件:
var imageContent = provider.Contents.First(c => c.Headers.ContentDisposition.Name.Equals("labelImage", StringComparison.OrdinalIgnoreCase)); var pdfBytes = await imageContent.ReadAsByteArrayAsync(); // 保存到本地 File.WriteAllBytes("labelImage.pdf", pdfBytes);
如果响应中的PDF是base64编码字符串,也可先读取字符串再转字节:
var pdfBase64 = await imageContent.ReadAsStringAsync(); var pdfBytes = Convert.FromBase64String(pdfBase64);
完整示例代码
using System; using System.IO; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using Newtonsoft.Json; public async Task ParseMultipartResponse() { using var httpClient = new HttpClient(); var response = await httpClient.GetAsync("你的API接口地址"); response.EnsureSuccessStatusCode(); // 确保请求成功 // 提取边界符 var contentType = response.Content.Headers.ContentType; var boundary = contentType.Parameters.First(p => p.Name == "boundary").Value; // 解析multipart内容 var provider = new MultipartMemoryStreamProvider(); await response.Content.ReadAsMultipartAsync(provider); // 处理元数据 var metadataContent = provider.Contents.First(c => c.Headers.ContentDisposition.Name.Equals("labelMetadata", StringComparison.OrdinalIgnoreCase)); var metadataJson = await metadataContent.ReadAsStringAsync(); var labelMetadata = JsonConvert.DeserializeObject<LabelMetadata>(metadataJson); // 处理PDF文件 var imageContent = provider.Contents.First(c => c.Headers.ContentDisposition.Name.Equals("labelImage", StringComparison.OrdinalIgnoreCase)); var pdfBytes = await imageContent.ReadAsByteArrayAsync(); File.WriteAllBytes(Path.Combine(Environment.CurrentDirectory, "labelImage.pdf"), pdfBytes); } // 匹配JSON结构的实体类 public class LabelMetadata { public LabelAddress labelAddress { get; set; } public string routingInformation { get; set; } public string trackingNumber { get; set; } public decimal postage { get; set; } public string zone { get; set; } public Commitment commitment { get; set; } public string weightUOM { get; set; } public decimal weight { get; set; } public string serviceTypeCode { get; set; } } public class LabelAddress { public string streetAddress { get; set; } public string secondaryAddress { get; set; } public string city { get; set; } public string state { get; set; } public string ZIPCode { get; set; } public string ZIPPlus4 { get; set; } public string firstName { get; set; } public string lastName { get; set; } public string firm { get; set; } public bool ignoreBadAddress { get; set; } } public class Commitment { public string name { get; set; } public string scheduleDeliveryDate { get; set; } }
内容的提问来源于stack exchange,提问作者James X.
相关产品推荐
相关产品推荐

