ASP.NET Core 2.1调用API请求到达控制器耗时过长问题排查求助
问题分析与解决方案
问题定位
请求到达控制器前的17-18秒延迟,大概率出在ASP.NET Core请求管道的前置环节(与控制器处理逻辑无关),可能涉及服务器配置、中间件执行、请求内容处理或网络层面的问题,而非API业务代码本身。
排查与解决步骤
启用请求管道日志追踪
在Startup.cs中添加管道入口日志,对比控制器方法的日志时间,明确延迟区间:public void Configure(IApplicationBuilder app, ILogger<Startup> logger) { app.Use(async (context, next) => { logger.LogInformation($"请求进入管道: {DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}, Path: {context.Request.Path}"); await next(); }); // 保留原有中间件配置,如UseMvc等 }在控制器方法开头也添加日志,计算两个时间点的差值,确认延迟是否发生在管道到控制器的阶段。
排查中间件顺序与耗时
ASP.NET Core中间件按注册顺序执行,逐个排查可疑项:- 临时注释非核心中间件(如自定义日志、第三方认证组件),测试请求耗时是否降低
- 给每个中间件添加耗时统计,定位具体拖慢流程的组件
服务器配置检查
- 若使用IIS:检查应用程序池的队列长度、进程回收策略(是否频繁回收)、快速失败保护状态;确认请求筛选规则未限制大体积请求
- 若使用Kestrel:调整连接与请求体配置,避免因限制导致阻塞:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseKestrel(options => { options.Limits.MaxRequestBodySize = null; // 根据实际场景调整,取消不必要的请求体大小限制 }) .UseStartup<Startup>();
请求内容与网络验证
- 检查请求是否包含大体积Body(如上传文件、大量JSON),ASP.NET Core默认缓冲请求体,大内容会导致解析延迟
- 直接在服务器本地调用API(跳过外部网络),若延迟消失则是客户端到服务器的网络问题;若依然存在,锁定为服务器内部问题
ASP.NET Core 2.1版本特定优化
2.1版本存在部分已知性能问题,可针对性处理:- 升级
Newtonsoft.Json到兼容的最新版本,解决旧版序列化/反序列化瓶颈 - 若API内部调用其他服务,改用
IHttpClientFactory管理HttpClient实例,避免频繁创建销毁导致的性能损耗
- 升级
禁用请求体缓冲(针对大请求场景)
若请求体体积较大,可直接读取流而非依赖默认缓冲:[HttpPost] public async Task<IActionResult> YourAction() { using (var reader = new StreamReader(Request.Body, Encoding.UTF8, leaveOpen: true)) { var requestContent = await reader.ReadToEndAsync(); // 业务处理逻辑 } return Ok(); }
内容的提问来源于stack exchange,提问作者KingCk
相关产品推荐
相关产品推荐

