为啥此 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 请求失败?的主要内容,如果未能解决你的问题,请参考以下文章