求助:.NET Core 6 WebApi遇Multipart body长度超限问题
.NET Core 6 WebApi处理multipart/mixed响应时的长度限制错误解决
问题场景
在.NET Core 6 WebApi项目中调用外部API获取响应,该API返回multipart/mixed格式内容(包含XML数据和图片数据),运行时抛出错误:Multipart body length limit 16384 exceeded。
控制器中使用IHttpClientFactory调用API的代码如下:
[Route("Get")] [HttpGet] public async Task<IActionResult> Get() { HttpResponseMessage response = await _httpClient.GetAsync("the_name_of_the_api_i_will_be_accessing"); if (response.IsSuccessStatusCode) { // 检查响应是否为multipart/mixed类型 var headers = response.Content.Headers; if (headers.ContentType?.MediaType == "multipart/mixed") { // 从Content-Type头中获取边界值 string boundary = headers.ContentType.Parameters.FirstOrDefault(p => p.Name == "boundary")?.Value ?? ""; if (string.IsNullOrWhiteSpace(boundary) || (boundary.Length > new FormOptions().MultipartBoundaryLengthLimit)) { throw new InvalidDataException("Boundary is missing or too long."); } Stream contentStream = await response.Content.ReadAsStreamAsync(); // 根据边界创建MultipartReader var reader = new MultipartReader(boundary, contentStream); // 循环读取所有分段内容 var section = await reader.ReadNextSectionAsync(); while (section != null) { // 检查每个分段的内容类型 var contentType = new ContentType(section.ContentType); // 根据内容类型处理分段 if (contentType.MediaType == "application/xml") { // 处理XML内容 var xmlContent = await section.ReadAsStringAsync(); // 处理XML逻辑 } else if (contentType.MediaType == "image/jpeg") { // 保存图片文件 using (var imageStream = File.Create("path/to/save/image.jpg")) { await section.Body.CopyToAsync(imageStream); } } // 读取下一个分段 section = await reader.ReadNextSectionAsync(); } } return Ok(); } else { return StatusCode((int)response.StatusCode, "API request failed"); } }
API响应示例
<?xml version="1.0" encoding="utf-8"?> <EventNotificationAlert version="2.0" xmlns="http://www.isapi.org/ver20/XMLSchema"> <dateTime>2023-08-22T09:47:30.486+07:00</dateTime> <eventState>active</eventState> <eventDescription>ANPR</eventDescription> ... </EventNotificationAlert> -----------------------------7daf10c20d06 Content-Disposition: form-data; name="detectionPicture"; filename="detectionPicture.jpg" Content-Type: image/jpeg Content-Length: 548804
已尝试的无效方案
- 调试时不查看
Request.Form - 配置
FormOptions增大各类长度限制:
var builder = WebApplication.CreateBuilder(args); { var services = builder.Services; var configuration = builder.Configuration; ... services.Configure<FormOptions>(x => { x.MultipartHeadersLengthLimit = Int32.MaxValue; x.MultipartBoundaryLengthLimit = Int32.MaxValue; x.MultipartBodyLengthLimit = Int64.MaxValue; x.ValueLengthLimit = Int32.MaxValue; x.BufferBodyLengthLimit = Int64.MaxValue; x.MemoryBufferThreshold = Int32.MaxValue; }); }
- 切换HTTP/HTTPS或移除
app.UseHttpsRedirection()
解决办法
你配置的FormOptions是用来处理传入到你的WebApi的请求的,而当前错误来自读取外部API响应时使用的MultipartReader——它默认有16384字节的BodyLengthLimit限制。
修改代码,在创建MultipartReader后手动设置更大的长度限制即可:
Stream contentStream = await response.Content.ReadAsStreamAsync(); // 根据边界创建MultipartReader var reader = new MultipartReader(boundary, contentStream); // 设置更大的Body长度限制,可根据实际响应大小调整 reader.BodyLengthLimit = int.MaxValue;
也可以根据响应头中的Content-Length动态设置:
if (response.Content.Headers.ContentLength.HasValue) { reader.BodyLengthLimit = response.Content.Headers.ContentLength.Value; } else { reader.BodyLengthLimit = int.MaxValue; // 无长度标识时设为最大值 }
这样就能解决分段内容长度超出限制的问题。
内容的提问来源于stack exchange,提问作者Mohamad Pais
相关产品推荐
相关产品推荐

