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

API Controller方法服务器端重复调用原因排查求助

这种场景我之前帮好几个朋友排查过,十有八九是IIS或者ASP.NET相关的超时、重试配置在搞鬼,给你捋几个最可能的方向,你挨个排查试试:

可能的IIS/ASP.NET配置原因

1. 应用程序请求路由(ARR)的自动重试

如果你的服务器部署了ARR(哪怕是本地反向代理用的),它默认会在后端请求超时的时候自动重试请求,这是最常见的原因:

  • 打开IIS管理器,找到服务器级的ARR配置,进入「服务器代理设置」
  • 重点看「重试次数」和「重试间隔」,如果设置了每5分钟重试一次,或者把超时时间改成了5分钟,那只要你的API处理超时,ARR就会自动发起重复调用
  • 另外,ARR的「超时时间」默认是30秒,要是被改成了5分钟,刚好匹配你观察到的间隔,大概率就是它

2. ASP.NET请求超时配置

不管你用的是ASP.NET Framework还是Core,请求超时设置都可能触发这类问题:

  • ASP.NET Framework:去web.config里找httpRuntime节点,看executionTimeout属性(默认110秒),如果被改成了5分钟,当请求超时后,IIS在某些场景下会自动重试未完成的请求
  • ASP.NET Core:检查Program.cs里的ConfigureKestrel或者IISServerOptions配置,有没有设置KeepAliveTimeout或RequestTimeout为5分钟,部分托管模式下超时后会触发请求重调度

3. IIS应用池的Ping检测机制

应用池的「Ping最大响应时间」配置也可能背锅:

  • 打开应用池的高级设置,找到「进程模型」下的「Ping最大响应时间」,如果设置为5分钟,当你的API长时间占用进程导致应用池没响应Ping请求时,IIS会终止进程并重启,此时未完成的请求可能会被重新执行

4. 隐性的客户端重试(别漏了!)

虽然你说UI没发起额外请求,但有些前端框架、浏览器或者HTTP客户端会偷偷重试:

  • Chrome等浏览器在遇到net::ERR_CONNECTION_RESET这类错误时,会自动重试请求
  • 像Axios这类客户端库,默认可能开启了重试机制,哪怕前端代码没显式配置
  • 你可以去服务器的访问日志(路径一般是C:\inetpub\logs\LogFiles)里查重复请求的来源IP、User-Agent,确认是不是真的没有客户端发起
排查小技巧
  • 先查服务器访问日志,看重复请求的请求ID、时间间隔是不是严格的5分钟,确认是同一请求重执行还是新请求
  • 临时关掉ARR的重试功能(如果启用了的话),观察是否还会出现重复调用
  • 把请求超时时间调得比你的API最长处理时间还长(比如15分钟),看能不能避免触发重复
  • 给API方法加个唯一请求ID的日志,每次调用都记录下来,这样能明确是不是同一个请求被反复执行

内容的提问来源于stack exchange,提问作者CBC_NS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:20:18