Asp.Net Core Web API超64KB请求无法完成问题求助
我之前在ASP.NET Core 2.0基于.NET Framework 4.6.1开发Web API时,也碰到过一模一样的大POST请求挂起问题,刚好就是卡在64KB左右的阈值。结合当时的排查经验,给你几个可行的解决方向:
ASP.NET Core 2.0默认对请求体大小有严格限制,尤其是Multipart类型的请求。你可以在Startup.cs里全局配置,也可以给单个Action单独设置:
全局配置(Startup.cs)
在ConfigureServices方法里添加FormOptions和Mvc的大小限制:
public void ConfigureServices(IServiceCollection services) { // 配置Multipart请求的各项限制,这里设为100MB services.Configure<FormOptions>(options => { options.MultipartBodyLengthLimit = 104857600; // 100MB options.ValueLengthLimit = 104857600; options.MultipartHeadersLengthLimit = 104857600; }); // 设置全局请求体最大大小 services.AddMvc(options => { options.MaxRequestBodySize = 104857600; // 100MB }).SetCompatibilityVersion(CompatibilityVersion.Version_2_0); }
单个Action单独配置
如果只有某个上传接口需要大请求,可以用[RequestSizeLimit]特性:
[HttpPost("upload")] [RequestSizeLimit(104857600)] // 允许100MB的请求 public async Task<IActionResult> UploadImage() { // 你的文件处理逻辑 return Ok(); }
因为你是基于完整.NET Framework,大概率是用IIS或VS自带的IIS Express托管,这时候IIS本身的限制也会导致请求挂起:
修改项目的web.config
在项目根目录的web.config里,添加或修改<system.webServer>节点下的配置:
<system.webServer> <security> <requestFiltering> <!-- 允许的最大请求内容长度,单位字节,这里是100MB --> <requestLimits maxAllowedContentLength="104857600" /> </requestFiltering> </security> <!-- 这个参数设置IIS提前读取的请求内容大小,避免因缓冲不足挂起 --> <serverRuntime uploadReadAheadSize="104857600" /> </system.webServer>
注意:uploadReadAheadSize的值必须小于等于maxAllowedContentLength,否则会报错。
IIS Express的额外配置
如果你用的是VS自带的IIS Express,可能需要修改它的全局配置文件:
找到Documents\IISExpress\config\applicationhost.config,搜索<requestLimits>节点,把maxAllowedContentLength改成你需要的值,或者针对你的项目单独添加站点级的配置。
如果你的上传接口是同步读取请求内容,很容易导致线程阻塞,看起来请求就像“挂起”了。一定要用异步方法读取表单数据:
[HttpPost("upload")] public async Task<IActionResult> Upload() { if (!Request.HasFormContentType) { return BadRequest("请上传正确的Multipart类型内容"); } // 异步读取表单数据,避免阻塞 var form = await Request.ReadFormAsync(); var imageFile = form.Files.FirstOrDefault(); if (imageFile == null || imageFile.Length == 0) { return BadRequest("请选择要上传的图片"); } // 后续的文件保存逻辑 return Ok(new { fileName = imageFile.FileName, size = imageFile.Length }); }
按照上面的步骤排查后,应该就能解决64KB以上POST请求挂起的问题了。
内容的提问来源于stack exchange,提问作者Vyzzuvazzadth

