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

求助:.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:12:51