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

添加自定义请求头后CORS跨域请求失败排查求助

问题排查与解决方案

1. 确认IIS是否拦截OPTIONS请求

  • 检查IIS的Handler Mappings,确保OPTIONS请求能被ASP.NET处理:
    • 打开IIS管理器,定位到你的API站点,进入Handler Mappings
    • 找到对应.NET版本的ExtensionlessUrlHandler-Integrated-4.0(或类似处理器),右键选择Edit
    • 在Request Restrictions的Verbs标签页,确认已包含OPTIONS;若未包含,手动添加
  • 检查站点的HTTP Response Headers,确认没有IIS全局配置的CORS头和你代码中的设置冲突——IIS的全局规则可能会覆盖global.asax里的配置

2. 专门处理OPTIONS预检请求

添加自定义头X-Tom后,浏览器会发送OPTIONS预检请求,你需要在global.asax中针对性处理:

protected void Application_BeginRequest()
{
    if (Request.HttpMethod == "OPTIONS")
    {
        Response.StatusCode = 200;
        Response.AddHeader("Access-Control-Allow-Origin", "www.test.com");
        Response.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
        Response.AddHeader("Access-Control-Allow-Headers", "X-Tom, Content-Type");
        Response.AddHeader("Access-Control-Max-Age", "86400"); // 缓存预检结果24小时,减少重复请求
        Response.End(); // 直接结束响应,避免后续逻辑干扰
        // 可在此添加邮件通知测试是否触发
        // SendEmail("OPTIONS预检请求已处理");
    }
    else
    {
        Response.AddHeader("Access-Control-Allow-Origin", "www.test.com");
        // 原有业务逻辑及邮件通知
        // SendEmail("非OPTIONS请求已触发");
    }
}

注意:处理OPTIONS时必须直接结束响应,否则后续路由或处理器可能会篡改响应头,导致预检失败。

3. 配置web.config强化请求支持

在web.config中添加配置,防止IIS拦截OPTIONS请求:

<system.webServer>
  <handlers>
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" 
         path="*." 
         verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 
         type="System.Web.Handlers.TransferRequestHandler" 
         preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
  <httpProtocol>
    <customHeaders>
      <!-- 若在此配置CORS头,需确保和global.asax设置完全一致,避免冲突 -->
      <!-- <add name="Access-Control-Allow-Origin" value="www.test.com" /> -->
      <!-- <add name="Access-Control-Allow-Headers" value="X-Tom, Content-Type" /> -->
    </customHeaders>
  </httpProtocol>
</system.webServer>

4. 验证预检请求状态

用浏览器开发者工具(Network标签)或Fiddler查看请求细节:

  • 确认OPTIONS请求的Origin为www.test.com
  • 检查响应头是否包含Access-Control-Allow-Origin: www.test.com和Access-Control-Allow-Headers: X-Tom
  • 若未收到OPTIONS响应,说明请求被服务器防火墙、URL重写规则或其他中间件拦截,需逐一排查这些环节

5. 避免CORS头冲突

确保global.asax和IIS的HTTP响应头中没有重复或矛盾的CORS配置——比如不要同时在两处设置Access-Control-Allow-Origin,否则会导致浏览器解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:22:43