You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 09:43:15