Asp.net服务端代码执行两次返回失败回调,仅新部署服务器出现该问题
故障排查与解决方案
常见触发原因
由于该问题仅出现在新部署的服务器上,原有服务器运行正常,100%是新服务器的配置差异导致,优先排查以下场景:
- HTTP重定向规则触发:新服务器IIS配置了HTTP强制跳转HTTPS、无尾斜杠跳转带尾斜杠这类规则时,你发送的POST请求会先被301/302重定向,浏览器处理重定向时默认会将POST改为GET、丢弃请求体,第一次POST请求会触发一次服务端代码执行,第二次GET请求无法匹配仅接受POST的WebMethod,最终返回错误触发error回调,相当于执行了两次逻辑。
- CORS预检请求未正确处理:如果前端域名和接口域名不一致,带
content-type: application/json的POST属于复杂跨域请求,浏览器会先发送OPTIONS类型的预检请求,若服务端没有过滤OPTIONS请求,会被当成正常请求处理触发一次逻辑,若预检请求返回不符合规范,后续实际POST请求不会发送或被拦截,直接触发error回调,也会出现两次执行的现象。 - IIS全局模块重复处理:新服务器可能额外安装了安全审计、请求过滤类的模块,或ASP.NET管道配置为集成模式与原有服务器的经典模式不一致,导致单次请求被管道处理两次。
排查步骤
- 打开浏览器F12开发者工具,切换到「网络」面板,复现请求后查看完整的请求链路:
- 确认是否存在301/302重定向记录
- 确认是否存在OPTIONS类型的请求
- 查看两次请求的状态码、响应头、响应内容
- 用Postman直接向接口地址发送单次POST请求,若返回正常则可确认是浏览器侧触发的两次请求,排除服务端代码本身的问题。
- 对比新老服务器的
Web.config、IIS站点配置,重点核对重写规则、CORS配置、应用程序池模式、请求过滤规则的差异。
对应解决方案
重定向问题修复
- 前端直接使用与服务器配置匹配的接口地址(比如直接写HTTPS地址、带正确的路径格式),避免触发重定向
- 若要保留重定向规则,可在规则中排除
*.aspx/*路径的接口请求,不对这类接口做重定向处理
CORS预检问题修复
在项目Web.config的<system.webServer>节点下添加以下配置,允许OPTIONS请求处理:
<httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="你的前端域名" /> <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" /> <add name="Access-Control-Allow-Headers" value="Content-Type" /> </customHeaders> </httpProtocol> <handlers> <remove name="OPTIONSVerbHandler" /> </handlers>
同时在Global.asax中添加以下逻辑,直接处理预检请求:
protected void Application_BeginRequest(object sender, EventArgs e) { if (Request.HttpMethod == "OPTIONS") { Response.StatusCode = 200; Response.End(); } }
管道配置问题修复
将新服务器的应用程序池模式调整为和老服务器一致的经典/集成模式,逐个排查IIS站点额外安装的第三方模块,禁用后重试验证。
内容的提问来源于stack exchange,提问作者Bala
相关产品推荐
相关产品推荐

