C# 解析Multipart/Related类型POST请求并提取PDF附件的方案
可用类库
无需引入第三方独立程序集,.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
相关产品推荐
相关产品推荐

