首页 文章

WebApi CORS和无运输

提问于
浏览
1

我需要帮助,因为我遇到了一些我无法找到解决问题的答案 .

我有一个在网站A上运行的asp.net mvc webapi和在站点B上运行的另一个站点 . 我认为这符合跨站点的定义 . 因此我有nuget'Microsoft.AspNet.WebApi.Cors'并添加了“config.EnableCors();”到WebApiConfig.cs的注册metohd . 我还添加了网站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调用的错误处理程序,错误是“没有传输” . 谁能看到我在这里做错了什么?

2 回答

  • 0

    抱歉全部,问题归结为Windows Server 2003无法识别IE 1浏览器并默认为不支持jquery调用的IE模式 .

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

    • Web Developer工具并查看了"Emulation"选项卡 .

    • 注意"Document mode"是8(默认值) .

    • 将此更改为"Edge"或"10",一切正常 .

    • 在解决方案中创建了一个"app_browser"文件夹 .

    • 创建了"ie.browser"文件 .

    • 将最新的Windows Server 2012 "ie.broswer"文件内容复制到此创建的文件中 .

    • 发布了该网站 .

    • 一切都好:)

    注意:Windows Server 2012“ie.browser”文件必须是最新版本,并且应用了修补程序 .

    希望这对你有所帮助 .

  • 1

    将dataType更改为'jsonp' .

    此外,不需要crossDomain属性:

    根据jQuery文档:

    crossDomain(对于同域请求,默认值为false,对于跨域请求,则为true)
    类型:布尔值
    如果要在同一域上强制执行跨域请求(例如JSONP),请将crossDomain的值设置为true . 这允许,为
    例如,服务器端重定向到另一个域 . (版本增加:1.5)

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

    还有关于jQuery文档:

    jsonp类型:String覆盖jsonp请求中的回调函数名称 . 在'callback =?'中将使用此值代替'callback' 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');}
    

相关问题