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

跨域POST触发OPTIONS返回403禁止:React调用.NET Web API问题

解决跨域POST请求中OPTIONS 403 Forbidden的问题

这明显是**跨域资源共享(CORS)**的问题——浏览器发起的预检OPTIONS请求被你的IIS 7.5或.NET Web API拒绝了。GET请求属于「简单请求」范畴,不需要预检就能直接通过,但POST请求如果带了自定义头、或者Content-Type不是application/x-www-form-urlencoded这类简单类型,浏览器就会先发送OPTIONS预检请求,确认服务器允许跨域后才会发起真正的POST请求。

下面是一步步的解决方案:

1. 配置.NET Web API的CORS支持

首先确保你的Web API项目正确启用了CORS:

  • 先安装NuGet包:Install-Package Microsoft.AspNet.WebApi.Cors
  • 在WebApiConfig.cs中添加CORS规则配置:
using System.Web.Http;
using System.Web.Http.Cors;

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // 指定允许跨域的前端域名,生产环境别用通配符*,要写具体域名
        var corsPolicy = new EnableCorsAttribute("http://www.domainA.com", "*", "*");
        // 如果前端请求需要带身份凭证(比如Cookie),打开下面这行注释
        // corsPolicy.SupportsCredentials = true;
        config.EnableCors(corsPolicy);

        // 保留原有的路由配置
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

2. 调整IIS 7.5配置,确保OPTIONS请求被正确处理

有时候即使.NET配置了CORS,IIS 7.5也会直接拦截OPTIONS请求返回403,这时候需要修改项目的web.config:

<system.webServer>
    <!-- 让所有托管模块处理所有请求,包括OPTIONS -->
    <modules runAllManagedModulesForAllRequests="true" />
    
    <httpProtocol>
        <customHeaders>
            <!-- 这里的响应头可以和.NET的CORS配置互补,但优先以.NET配置为主 -->
            <add name="Access-Control-Allow-Origin" value="http://www.domainA.com" />
            <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" />
            <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization" />
            <!-- 如果需要带身份凭证,添加这行 -->
            <!-- <add name="Access-Control-Allow-Credentials" value="true" /> -->
        </customHeaders>
    </httpProtocol>

    <handlers>
        <!-- 移除默认的OPTIONS处理器,让.NET接管处理 -->
        <remove name="OPTIONSVerbHandler" />
        <add name="OPTIONSVerbHandler" 
             path="*" 
             verb="OPTIONS" 
             modules="IsapiModule" 
             scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" 
             resourceType="Unspecified" 
             requireAccess="None" 
             preCondition="classicMode,runtimeVersionv4.0,bitness32" />
    </handlers>
</system.webServer>

注意:如果你的IIS应用池是集成模式,handlers部分的配置可以简化,只要确保runAllManagedModulesForAllRequests="true"即可。

3. 排查常见坑点

  • 检查请求筛选:打开IIS管理器→你的站点→请求筛选→HTTP动词,确认OPTIONS是允许的(没有被添加到拒绝列表)。
  • Content-Type验证:如果你的POST请求用了application/json,确保CORS配置里明确允许Content-Type头(上面的配置已经包含)。
  • 身份验证冲突:如果你的API启用了Windows身份验证或其他认证机制,预检OPTIONS请求是不带凭证的,需要确保IIS不对OPTIONS请求要求认证。可以在web.config的<system.web>节点添加:
<authorization>
    <allow verbs="OPTIONS" users="*" />
    <deny users="?" />
</authorization>

测试验证

可以用Postman直接发送OPTIONS请求到http://www.domainB.com/api/postdataoperation,如果返回200状态码且包含正确的CORS响应头,说明配置生效了,之后前端的POST请求应该就能正常发送了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:01:42