【问题标题】:WebApi CORS and No TransportWebApi CORS 和无传输
【发布时间】:2014-01-28 21:26:32
【问题描述】:

我需要帮助,因为我遇到了无法解决问题的问题。

我有一个在站点 A 上运行的 asp.net mvc webapi 和另一个在站点 B 上运行的站点。我相信这符合跨站点的定义。因此我有 nuget 'Microsoft.AspNet.WebApi.Cors' 并添加了“config.EnableCors();”到 WebApiConfig.cs 的注册方法。我还添加到站点 A 的 web.config 中

   <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="POST,GET,OPTIONS" />
            <!-- Latest Browser Mode-->
            <add name="X-UA-Compatible" value="IE=Edge" />
        </customHeaders>
    </httpProtocol>

除此之外,我已将 [EnableCors("", "", "*")] 添加到我正在使用的控制器基类中。

我认为这是为 webapi 站点启用 cors 所需的一切。

在站点 B 我有一个使用以下内容的 javascript 函数:

 $.ajax({                
            url: url,
            type: 'GET',
            data: {},
            dataType: 'json',
            contentType: "application/json; charset=utf-8",
            crossDomain: true,
            success: function (data, textStatus, jqXHR) {
                alert('success');
            },
            error: function (jqXHR, textStatus, err) {
                if (window.console) console.log("Error with ajax call: " + err);
                $('#findCustomer').text('Error: ' + err);
            },
            beforeSend: function (xhr) {
                var headerValue = "Basic <somecode>";
                xhr.setRequestHeader('Authorization', headerValue);
            }
        });

问题是我一直在访问 ajax 调用的错误处理程序,而错误是“无传输”。谁能看到我在这里做错了什么?

【问题讨论】:

  • 查看 ajax 的标头,也许您不允许使用正确的标头。尝试 (不知道是否允许)。至少在 beforeSend 函数中添加您明确设置的授权。
  • 这样做有点困难,因为即使提琴手也没有显示由于这段代码而离开的请求。注意:提琴手正在显示页面加载,但在运行此代码后没有请求。我已经在页面上放了hte调试器,可以验证代码是否到达了这段代码。
  • 所以浏览器正在停止请求...将dataType更改为'jsonp'?
  • 它出来了,但是 url 有参数并且当 &callback= 添加了错误 SCRIPT1004: Expected ';'被抛出。从请求返回的结果也是一个 JSon 字符串
  • 检查我的答案并更新代码,看看是否能通过!

标签: jquery asp.net-mvc cors


【解决方案1】:

抱歉,问题归结为 windows server 2003 无法识别 IE 1 浏览器并默认使用不支持 jquery 调用的 IE 模式。

我是如何解决这个问题的:

  1. Web 开发人员工具并查看了“仿真”选项卡。
  2. 注意“文档模式”为 8(默认)。
  3. 将此更改为“Edge”或“10”,一切正常。
  4. 在解决方案中创建了一个“app_browser”文件夹。
  5. 创建了一个“ie.browser”文件。
  6. 将最新的 windows server 2012 "ie.broswer" 文件内容复制到这个创建的文件中。
  7. 发布了网站。
  8. 一切顺利:)

注意:windows server 2012“ie.browser”文件必须是应用了热修复的最新版本。

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    将数据类型更改为“jsonp”。

    另外,crossDomain 属性不是必需的:

    根据 jQuery 文档:

    crossDomain (default: false for same-domain requests, true for cross-domain requests)
    Type: Boolean
    If you wish to force a crossDomain request (such as JSONP) on the same domain, set the value of crossDomain to true. This allows, for
    

    例如,服务器端重定向到另一个域。 (添加的版本: 1.5)

    此外,作为 jQuery 文档,X-Requested-With 标头始终会添加,因此您也必须接受该标头。

    还有 jQuery 文档:

    jsonp 类型:字符串 覆盖 jsonp 中的回调函数名称 要求。在 “回调=?” url 中查询字符串的一部分。所以 {jsonp:'onJSONPLoad'} 会导致 'onJSONPLoad=?'传递给 服务器。从 jQuery 1.5 开始,将 jsonp 选项设置为 false 会阻止 jQuery 将 "?callback" 字符串添加到 URL 或尝试 使用“=?”为转型。在这种情况下,您还应该明确 设置 jsonpCallback 设置。例如,{ jsonp: false, jsonpCallback: "callbackName" }

    所以,将 jsonp 设置为 false

    更新的代码应该是:

    $.ajax({                
            url: url,
            type: 'GET',
            data: {},
            dataType: 'jsonp',
            contentType: "application/json; charset=utf-8",
            jsonp: false,
            jsonpCallback: "callbackName",
            success: function (data, textStatus, jqXHR) {
                alert('success');
            },
            error: function (jqXHR, textStatus, err) {
                if (window.console) console.log("Error with ajax call: " + err);
                $('#findCustomer').text('Error: ' + err);
            },
            beforeSend: function (xhr) {
                var headerValue = "Basic <somecode>";
                xhr.setRequestHeader('Authorization', headerValue);
            }
        });
    function callbackName() { console.log('worked');} 
    

    【讨论】:

    • 1.将 Web.Config 更改为 2. 更改 jquery 调用以反映上述内容,但得到 SCRIPT1004: Expected ';'当我认为它尝试像 javascript 一样解析返回的 json 对象时。
    • 我在上次更新中添加了 jsonCallback,因为 doc 明确要求这样做。
    • 添加回调如下: jsonpCallback: function (data) { alert("success = " + data); },但是数据未定义,脚本错误仍然发生。
    • 回调是字符串而不是函数。具有名称的函数必须存在,但 ajax 上的参数必须是字符串。添加了 callbackName() 函数。
    • 抱歉,字符串只是函数的委托,函数声明也是可以接受的。
    猜你喜欢
    • 2013-09-24
    • 2012-12-29
    • 2017-03-07
    • 2015-08-21
    • 2017-10-24
    • 2014-12-11
    • 2014-07-30
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多