为啥此 CORS 请求失败?

Posted

技术标签:

【中文标题】为啥此 CORS 请求失败?【英文标题】:Why is this CORS Request failing?为什么此 CORS 请求失败? 【发布时间】:2014-11-23 05:19:00 【问题描述】:

我正在尝试使用以下代码从 Web api 获取值,目前是硬编码的。 然而,它会导致 100% 的“错误”部分,我不知道为什么。 欢迎任何帮助。

    function SignIn() 
        $.ajax(
            type: 'GET',
            url: 'http://localhost:1200/Api/Values/3',
            dataType: "jsonp",
            crossDomain: true,
            xhrFields: 
                'withCredentials': true
            ,
            headers: 
                'Access-Control-Allow-Origin': '*'
            ,
            success: function (data) 
                debugger;
                alert(data);
            ,
            error: function (xhr, ajaxOptions) 
                debugger;
                alert(xhr.status);
                alert(ajaxOptions);
            
        );
    

服务器端:

[EnableCors("Access-Control-Allow-Origin", "*", "*")]
public string Get(int id)

   return "Name: 'Foo', Id: '1234',Rank: 7";

Web.Config(服务器):

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>

【问题讨论】:

您是否检查了控制台的“网络”选项卡以查看按头发送和接收的内容? 接受:/;接受编码:gzip,放气;接受语言:nl,en-US;q=0.7,en;q=0.3 ;用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0 JSONP 不是 CORS。你不应该使用 JSONP。 那你能给我举个例子来说明如何制作和解析 CORS 请求吗? 【参考方案1】:

对于jsonp,您必须定义一个回调函数。小心,JSON 想要键和值的双引号:

[EnableCors("Access-Control-Allow-Origin", "*", "*")]
public string Get(int id)

   return "callback(\"Name\": \"Foo\", \"Id\": \"1234\",\"Rank\": 7)";

现在是阿贾克斯:

function SignIn() 
    $.ajax(
        type: 'GET',
        url: 'http://localhost:1200/Api/Values/3',
        dataType: "jsonp",
        jsonpCallback: "callback",
        xhrFields: 
            'withCredentials': true
        ,
        success: function (data) 
            debugger;
            alert(data);
        ,
        error: function (xhr, ajaxOptions) 
            debugger;
            alert(xhr.status);
            alert(ajaxOptions);
        
    );

或者您可以通过将jsonp 更改为json 来尝试您的代码,以获取dataType

【讨论】:

进行您要求的修改(不是 jsonp 到 json),我得到了同样的错误。重命名为 json 又给了我一个 cors 错误。 奇怪,你不能正常使用jsonp得到CORS错误。错误在哪里? 在 ajax 中,他跳入了“错误”部分,xhr.status = 200 和 ajaxoptions = parsererror。你有工作版本吗? 遗憾的是,这也没有奏效。我只想读取另一个网站返回的 json 或 xml 结果,在这种情况下是我的 api ... 对不起。您可以尝试删除“回调(…)”后的分号吗?

以上是关于为啥此 CORS 请求失败?的主要内容,如果未能解决你的问题,请参考以下文章

在对 Apache2 进行安全更新后,我的 CORS 请求开始失败。我不知道为啥。

为啥在 Firefox 中向 google Drive Sheet 发出的这个 CORS 请求会失败? (在 Chrome 中工作)

CORS 发布请求失败

CORS 请求重定向失败

iOS CORS ajax 请求 readyState 0

IE 11 上 CORS 预检请求的奇怪问题失败