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

C# 解析Multipart/Related类型POST请求并提取PDF附件的方案

针对Multipart/Related类型POST请求的C#解析方案

可用类库

无需引入第三方独立程序集,.NET官方内置类库即可满足需求:

  • ASP.NET Core 2.1+ / .NET 5+ 环境:使用Microsoft.AspNetCore.WebUtilities命名空间下的MultipartReader类
  • .NET Framework 4.x 环境:使用Microsoft.AspNet.WebApi.Client包内置的多部分内容解析类

核心实现逻辑

Multipart/Related和你已经实现的普通Multipart/FormData解析逻辑底层一致,仅需额外适配内容类型判断规则即可:

  • 先从请求的Content-Type头中提取boundary分隔标识
  • 逐段读取多部分内容,根据每段的Content-Type区分XML主体和PDF附件
  • 分别处理XML内容读取、PDF附件流写入本地存储的逻辑

参考代码(ASP.NET Core环境)

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.WebUtilities;
using System.Net.Http.Headers;

public async Task ProcessMultipartRelatedRequest(HttpRequest request)
{
    // 校验请求类型
    if (!request.ContentType.StartsWith("multipart/related", StringComparison.OrdinalIgnoreCase))
    {
        throw new ArgumentException("请求类型不为Multipart/Related");
    }

    // 提取分隔符boundary
    var mediaTypeHeader = MediaTypeHeaderValue.Parse(request.ContentType);
    var boundary = mediaTypeHeader.Boundary.Value.Trim('"');
    var multipartReader = new MultipartReader(boundary, request.Body);

    MultipartSection section;
    // 逐段解析内容
    while ((section = await multipartReader.ReadNextSectionAsync()) != null)
    {
        var contentType = section.ContentType;
        var contentDisposition = ContentDispositionHeaderValue.Parse(section.ContentDisposition);

        // 读取XML主体内容
        if (contentType.StartsWith("application/xml") || contentType.StartsWith("text/xml"))
        {
            using var streamReader = new StreamReader(section.Body);
            string xmlBody = await streamReader.ReadToEndAsync();
            // 此处添加XML内容的处理逻辑
        }
        // 提取保存PDF附件
        else if (contentType.Equals("application/pdf", StringComparison.OrdinalIgnoreCase))
        {
            var fileName = contentDisposition.FileName.Value.Trim('"');
            var saveFullPath = Path.Combine("你的本地附件保存目录", fileName);
            using var outputFileStream = new FileStream(saveFullPath, FileMode.Create, FileAccess.Write);
            await section.Body.CopyToAsync(outputFileStream);
        }
    }
}

补充说明

如果是.NET Framework环境,仅需将读取请求流的部分替换为MultipartFormDataStreamProvider相关逻辑即可,核心的内容类型判断、流读写逻辑无需调整。

内容的提问来源于stack exchange,提问作者Greg Wilborn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:42:00