ASP.NET Core 6 Web API返回JsonResult性能异常缓慢求助
ASP.NET Core 6 Web API返回大JSON数据性能异常问题
我们有一个从ASP.NET Core 3.1升级而来的ASP.NET Core 6 C# Web API项目,目前遇到如下性能问题:所有使用return new JsonResult(data)的API返回12万行数据耗时32秒,但直接调用JsonConvert.SerializeObject(data)仅需约3秒。
问题出在return语句之后:
var testResult = new JsonResult(data); return restResult; // 此处之后速度骤降,问题核心区域
执行到return行本身速度很快,但后续操作额外增加了30秒耗时。初步排查显示.NET 6在缓冲区和磁盘写入相关机制上有变更,但暂未确定具体原因。
我们当前使用Newtonsoft Json(6.0.20),切换为System.Text.Json(6.0.8)后问题仍未解决。
更新:切换到.NET 7可解决该问题,但.NET 7并非长期支持版本,无法作为长期解决方案。
涉及的示例代码
从Neo4j获取数据耗时约6秒,问题集中在return环节:
/// <summary> /// 从Neo4j数据库返回所有边及所需信息 /// </summary> /// <returns>包含GeoJson的边数组</returns> [Authorize] [HttpGet("AllNetwork")] public async Task<IActionResult> GetAllMap() { // 检查缓存中的最新版本 int version = neo.GetLatestNetworkStatusVersion(); if (neo.GetNetworkStatus(version) < NetworkStatus.Uploaded) { return new JsonResult(CachedNetworkResult.NETWORK_MAINTENANCE()); } Stopwatch stopwatch = Stopwatch.StartNew(); if (mainMapCache == null || !mainMapCache.Valid(version)) { mainMapCache = null; GC.Collect(); // 如果有新版本或未加载缓存,则下载新缓存 mainMapCache = new APINetworkResultCache(version) { Result = await neo.GetMapAllAsync() // 数组类型 }; } else { mainMapCache.CacheUsed = true; } var res = CachedNetworkResult.SUCCESS(mainMapCache); mainMapCache.DownloadTime = stopwatch.ElapsedMilliseconds; Debug.WriteLine($"获取网络数据耗时 {mainMapCache.DownloadTime:N0}ms"); return Json(res); // 问题出在这里 }
已尝试的无效方案
- 使用
return new JsonResult(res); - 将OutputFormatterMemoryBufferThreshold设置为30MB和300MB
- 移除async/await改为同步调用
- 设置MvcOptions.SuppressOutputFormatterBuffering = true
- 参考相关博客的两种优化方案
- 通过Postman请求(耗时相同,返回文件大小23.7MB)
- 切换为默认System.Text.Json(.NET 7无需修改即可1秒内返回数据)
- 尝试return new JsonResult、return Json、return Ok、return Content等多种返回方式
Startup.cs中Newtonsoft JSON相关配置
services.AddMvc() //.AddJsonOptions(options => //{ // options.JsonSerializerOptions.DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull; // options.JsonSerializerOptions.PropertyNameCaseInsensitive = false; //}) .AddMvcOptions(options => { options.EnableEndpointRouting = false; }) .AddNewtonsoftJson(); // 添加默认的内存实现IDistributedCache services.AddDistributedMemoryCache(); services.AddSession(options => { options.IdleTimeout = TimeSpan.FromHours(8); options.Cookie.HttpOnly = false; options.Cookie.IsEssential = true; }); services.AddControllers().AddNewtonsoftJson(); services.AddControllersWithViews().AddNewtonsoftJson(); services.AddRazorPages().AddNewtonsoftJson();
内容的提问来源于stack exchange,提问作者Liam
相关产品推荐
相关产品推荐

