在 Web API 中启用了 CORS,但访问被拒绝

Posted

技术标签:

【中文标题】在 Web API 中启用了 CORS,但访问被拒绝【英文标题】:CORS is enable in Web API but access is denied 【发布时间】:2019-04-18 02:40:56 【问题描述】:

我很确定我的 Web API 项目中启用了 CORS,但访问被拒绝。也许我配置错误?

错误:

从源“http://localhost:55817”访问位于“http://localhost/ControlTower2WebAPI/api/PurchaseOrder/PagingCriticalPart”的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态。

Ajax 调用:

<script type="text/javascript">
    $(document).ready(function () 
        var _tableId = 'tableCriticalParts';
        var _table = $('#' + _tableId).DataTable(
            "processing": true,
            "serverSide": true,
            "ajax": 
                url: 'http://localhost/ControlTower2WebAPI/api/PurchaseOrder/PagingCriticalPart',
                type: 'POST',
                contentType: "application/json",
                data: function (data) 
                    //debugger;
                    var model = 
                        draw: data.draw,
                        start: data.start,
                        length: data.length,
                        columns: data.columns,
                        search: data.search,
                        order: data.order
                    ;
                    return JSON.stringify(model);
                ,
                failure: function (result) 
                    debugger;
                    alert("Error occurred while trying to get data from server: " + result.sEcho);
                ,
                error: function (XMLHttpRequest, textStatus, errorThrown) 
                    debugger;
                    alert("Error occurred while trying to get data from server!");
                
                ,
                dataSrc: function (json) 
                    debugger;
                    for (key in json.Data)  json[key] = json.Data[key]; 
                    delete json['Data'];
                    return json.data;
                
            
            ,
            "columns": [
                 "data": "partNumber", title: "partNumber" ,
                 "data": "partDescription", title: "partDescription" 
            ]
        );
    );
</script>

Web API 项目的Web.config:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Headers" value="Content-Type" />
            <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

Web API 项目中的WebApiConfig:

public static class WebApiConfig

    public static void Register(HttpConfiguration config)
    
        config.EnableCors();

        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/controller/id",
            defaults: new  id = RouteParameter.Optional 
        );

        //set API to return JSON
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    

【问题讨论】:

【参考方案1】:

由于config.EnableCors() 行无需任何显式配置即可启用 CORS,我猜测您的自定义标头已被 CORS 模块覆盖。

启用时可以尝试添加全局CORS配置,如:

public static class WebApiConfig

    public static void Register(HttpConfiguration config)
    
        var corsAttr = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(corsAttr);

        // Rest of config ...
    

我建议使用这种方法(具有更严格的来源集)并从您的 web.config 中删除 &lt;customHeaders&gt;

来源:https://enable-cors.org/server_aspnet.html(全球启用)

【讨论】:

感谢您帮我解决了这个问题。我添加了“全部允许”策略,但在配置时我没有指定该策略。

以上是关于在 Web API 中启用了 CORS,但访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure 上为 .NET Web Api 启用 CORS

chrome 中的 Angularjs 应用程序中的 CORS 错误访问 .NET Web Api

即使在使用 ASP.NET CORE Web Api 启用 CORS 后,仍然可以通过 POSTMAN 访问 API [重复]

在 asp net core web api v3.0 中启用 CORS 的问题

在 Web API Core 和 Angular JS 中启用 CORS

WEB API:我显然无法启用 CORS(?)