.NET 5 Web API非调试模式大文件上传失败:远程主机强制关闭连接
解决.NET 5 Web API大文件上传在
dotnet run下的问题 针对你遇到的调试模式正常、dotnet run启动时无法上传大文件的问题,核心原因是Kestrel服务器的默认配置限制,以下是具体解决方案:
1. 显式配置Kestrel的请求体大小与超时
在Program.cs(.NET 5顶级语句模式)或Startup.cs中,通过UseKestrel直接调整服务器限制:
// Program.cs 示例 var builder = WebApplication.CreateBuilder(args); // 配置Kestrel参数 builder.WebHost.ConfigureKestrel(options => { // 设置请求体大小无限制(也可指定具体值,如6L * 1024 * 1024 * 1024表示6GB) options.Limits.MaxRequestBodySize = null; // 延长连接超时,适配大文件上传时长 options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(30); }); // 其他服务配置... var app = builder.Build(); // 启用全局请求大小限制中间件 app.UseRequestSizeLimit(int.MaxValue); // 其他中间件配置... app.Run();
2. 在配置文件中固化Kestrel配置
在appsettings.json或appsettings.Development.json中添加Kestrel全局配置,确保dotnet run启动时加载正确参数:
{ "Kestrel": { "Limits": { "MaxRequestBodySize": null, "KeepAliveTimeout": "00:30:00" } } }
3. 调整客户端HttpClient的超时设置
客户端上传大文件时,需匹配服务端超时配置,避免客户端先断开连接:
// 客户端上传示例 using var httpClient = new HttpClient(); // 设置足够长的超时时间,如30分钟 httpClient.Timeout = TimeSpan.FromMinutes(30); // 执行文件上传逻辑...
4. 检查Action级别的请求限制
如果你的API中使用了[RequestSizeLimit]特性,确保其值设置合理:
// 在Controller或Action上设置特性 [RequestSizeLimit(6L * 1024 * 1024 * 1024)] // 允许6GB文件上传 public IActionResult Upload(IFormFile file) { // 文件处理逻辑 }
关键说明
Visual Studio调试模式默认使用IIS Express或内置调试服务器,其配置继承了项目调试设置,无严格请求大小限制;而dotnet run直接启动Kestrel,会加载默认配置或你指定的配置文件,错误中的连接强制关闭正是因为默认限制触发了服务端主动断连。
内容的提问来源于stack exchange,提问作者Shangwu
相关产品推荐
相关产品推荐

