IIS偶发返回404错误但请求文件/接口真实存在问题咨询
偶发404问题的可能原因及排查方案
一、常见触发原因
- 应用程序池自动回收/重启间隙的请求丢失:.NET Core 2.1依托
AspNetCoreModule在IIS中托管运行,应用池触发闲置超时回收、定期自动回收、或者进程异常崩溃重启的时间窗口内,新进入的请求会被IIS直接返回404,此时后端托管进程还未完成初始化,无法处理请求。 - 路由匹配优先级冲突:AngularJS前端SPA路由、.NET Core后端API路由、静态文件路由的匹配规则冲突,尤其是配置了SPA fallback路由的场景下,偶发时序问题会导致静态文件/API请求被错误识别为前端路由,返回404。
- IIS模块处理顺序异常:静态文件处理模块和
AspNetCoreModule的处理顺序配置错误,高并发场景下偶发请求未被正确路由到对应的处理模块,直接返回404。 - 权限校验偶发失效:网站根目录的访问权限配置异常,比如应用池运行身份的文件读取权限在磁盘IO过高、域身份验证抖动时校验超时,IIS会误返回404而非403错误。
- 特殊字符请求拦截:请求URL包含特殊字符时,IIS默认的请求过滤规则偶发拦截请求,返回404状态码。
二、排查修复步骤
- 先确认404的返回主体:查看404响应的内容,是IIS默认404页还是你方站点自定义的404内容。如果是站点自定义内容,说明请求已经进入.NET Core托管进程,属于路由匹配问题;如果是IIS默认页,说明问题出在IIS管道层面。
- 核查IIS日志的子状态码:提取404请求对应的子状态码、win32状态码:
- 子状态码为0且win32状态码为2:IIS层面确实未找到对应文件
- 子状态码为3:权限校验失败
- 子状态码为4:请求被IIS过滤规则拦截
- 验证应用池回收影响:将应用池的「闲置超时」设置为0,「定期自动回收时间」设置为0,禁用自动回收策略后观察24小时,若问题不再复现即可确认是回收导致,后续可配置应用初始化模块预热,避免重启间隙的请求失败。
- 开启失败请求跟踪(FRT):在IIS中针对404状态码开启失败请求跟踪,复现问题后即可查看请求在IIS管道的哪一个环节被返回404,精准定位是静态文件模块还是托管模块的问题。
- 调整路由匹配优先级:在
web.config中明确静态文件处理模块的优先级高于AspNetCoreModule,同时在.NET Core的Startup配置中,将静态文件中间件放在路由中间件、SPA fallback中间件之前,避免路由冲突。
内容的提问来源于stack exchange,提问作者Mostafa Fallah
相关产品推荐
相关产品推荐

