ASP.NET Core Web API中ApiController的POST请求里Request对象为null但files参数正常可用的问题排查
看起来你遇到的是ASP.NET Core Web API中混用旧框架控制器基类导致的典型问题,我来帮你拆解原因并给出修复方案:
核心原因分析
你当前的控制器继承了ApiController,但这里要注意:如果这个ApiController来自System.Web.Http命名空间(旧ASP.NET Web API的基类),在ASP.NET Core环境下不会被正确初始化其Request属性,所以会出现Request为null的情况。而文件参数files能正常绑定,是因为ASP.NET Core的模型绑定系统独立工作,不受旧基类的影响。
另外,你代码里用Request.Content.IsMimeMultipartContent()也是旧Web API的写法,在ASP.NET Core中已经不再使用这种方式检查请求内容类型了。
具体修复步骤
1. 修正控制器的基类与特性
在ASP.NET Core中,正确的API控制器应该继承ControllerBase,并添加[ApiController]特性(而非继承旧的ApiController类)。修改后的控制器代码如下:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Hosting; using System.Threading.Tasks; using System.Collections.Generic; [ApiController] [Route("upload")] // 统一设置路由前缀,匹配你的请求路径 public class UploadController : ControllerBase { private readonly IWebHostEnvironment _webHostEnvironment; // 若仅在控制器内访问请求上下文,无需注入IHttpContextAccessor,ControllerBase已内置HttpContext属性 public UploadController(IWebHostEnvironment webHostEnvironment) { _webHostEnvironment = webHostEnvironment; } [HttpPost("PostFormData")] public async Task<IActionResult> PostFormData(List<IFormFile> files, CancellationToken cancellationToken) { try { // ASP.NET Core中检查multipart/form-data的正确方式 if (!Request.HasFormContentType || !Request.ContentType.StartsWith("multipart/form-data")) { return StatusCode(StatusCodes.Status415UnsupportedMediaType, "不支持的媒体类型"); } // 后续文件处理逻辑... return Ok("文件接收成功"); } catch (Exception ex) { return BadRequest(ex.Message); } } }
2. 处理IHttpContextAccessor(可选)
如果你确实需要在非控制器类中访问请求上下文,才需要保留IHttpContextAccessor,且必须在Program.cs中注册服务:
builder.Services.AddHttpContextAccessor();
仅在控制器内的话,直接使用ControllerBase内置的HttpContext属性即可,无需额外注入。
3. 验证路由匹配
你的请求路径是/upload/PostFormData,通过[Route("upload")]和[HttpPost("PostFormData")]的组合,能确保请求与Action正确匹配。
额外说明
从你提供的请求头来看,客户端发送的是标准的multipart/form-data请求,内容类型完全符合要求。修复控制器基类和请求检查逻辑后,ControllerBase的Request属性会被正确初始化,你可以正常访问其所有属性。
内容来源于stack exchange

