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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:47:31