WebApi CORS和无运输

时间:2014-01-10 02:41:52

标签: jquery asp.net-mvc cors

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

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

2 个答案:

答案 0 :(得分:1)

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

我如何解决这个问题:

  1. Web Developer工具,查看了“Emulation”选项卡。
  2. 注意到“文档模式”是8(默认)。
  3. 将其更改为“Edge”或“10”,一切正常。
  4. 在解决方案中创建了一个“app_browser”文件夹。
  5. 创建了“ie.browser”文件。
  6. 将最新的Windows Server 2012“ie.broswer”文件内容复制到此创建的文件中。
  7. 发布了该网站。
  8. 一切都很好:)。
  9. 注意:Windows Server 2012“ie.browser”文件必须是最新的,并且应用了修补程序。

    希望这会对你有所帮助。

答案 1 :(得分:0)

将dataType更改为&#39; jsonp&#39;。

此外,不需要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类型:String覆盖jsonp中的回调函数名称   请求。将使用此值代替&#39;回调&#39;在里面   &#39;回调=&#39?; url中查询字符串的一部分。所以   {jsonp:&#39; onJSONPLoad&#39;}会导致&#39; onJSONPLoad =?&#39;传递给了   服务器。从jQuery 1.5开始,将jsonp选项设置为false可以防止   jQuery来自添加&#34;?回调&#34;字符串到URL或尝试   使用&#34; =?&#34;转型。在这种情况下,您还应该明确   设置jsonpCallback设置。例如,{jsonp:false,   jsonpCallback:&#34; callbackName&#34; }

所以,将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');}