Web API 2 - CORS 仅适用于 HTTPS(而非 HTTP)

Posted

技术标签:

【中文标题】Web API 2 - CORS 仅适用于 HTTPS(而非 HTTP)【英文标题】:Web API 2 - CORS only works over HTTPS (not HTTP) 【发布时间】:2015-09-08 07:02:42 【问题描述】:

全部,

我正在处理一个非常简单的 Web API 2 项目。出于某种原因,除非我将它放在 web.config 文件中,否则我无法让 CORS 正常工作。我按照MSDN article 和ASP.NET article 上的说明进行操作,但我一定遗漏了一些东西。

Global.asax.cs

protected void Application_Start()

    WebApiConfig.Register(GlobalConfiguration.Configuration);

WebApiConfig.cs

public static void Register(HttpConfiguration config)

    config.EnableCors(new EnableCorsAttribute("*","*","*"));

    config.MapHttpAttributeRoutes();

JavaScript

    $.ajax(
        url: '//myapidomain.com/buildings'
    ).done(function (data) 
        var theList     = $('.buildings'),
            theListhtml = "",
            response    = JSON.parse(data);

        $.each(response.Buildings.Data, function () 
            theListHTML += '<li>' + this.Description + '</li>';
        );
        theList.html(theListHTML);
    );

我查看了几乎每一个 Stack Overflow(例如 this one)和 MSDN 论坛帖子(例如 this one),据我所知,这应该有效.该应用程序托管在运行 4.0 的 IIS 8 服务器上。

更新

这似乎与请求本身(或者更确切地说是 IIS 配置)有关。如果我通过 HTTP 发送请求,那么它会失败(没有访问控制标头被发回)。但是,如果我通过 HTTPS 请求它,一切正常。

解决方案

我们的托管环境正在拦截非 HTTPS 请求并强制它们使用 HTTPS。当它这样做时,它返回一个 304,jQuery 的方法不知道如何处理。解决方案是始终通过 HTTPS(首选)发出请求,或者自己处理这种情况/找到处理这种情况的替代库/插件。

【问题讨论】:

你能链接那个 MSDN 文章吗? @Jasen - 我已经更新了原始帖子,其中包含我阅读过的文章和其他帖子的链接,以尝试解决问题 失败时网络标头是什么样的? @Jasen - Chrome 网络控制台将它们列为 302,并显示错误“请求的资源上不存在‘Access-Control-Allow-Origin’标头。因此不存在原点‘[mydomain]’允许访问。” 您在.ajax() 请求中尝试过crossDomain: true 选项吗? 【参考方案1】:

解决方案

我们的托管环境正在拦截非 HTTPS 请求并强制它们使用 HTTPS。当它这样做时,它返回一个 304,jQuery 的方法不知道如何处理。解决方案要么总是通过 HTTPS(首选)发出请求,要么自己处理这种情况/找到处理这种情况的替代库/插件。

【讨论】:

以上是关于Web API 2 - CORS 仅适用于 HTTPS(而非 HTTP)的主要内容,如果未能解决你的问题,请参考以下文章

CORS 仅适用于一个请求 [重复]

Cloudfront CORS 仅适用于子域

Cloudfront CORS仅适用于子域

Azure api OAuth2 隐式流适用于 http 但不适用于 htt

.Net Core 3.1 Web Api 的 403 Forbidden Error 仅适用于 Delete & PUT 方法

CORS 问题:C# API 请求适用于一个域,但不适用于另一个域