【问题标题】:Call ASP Web API Cross Domain using jQuery Ajax使用 jQuery Ajax 调用 ASP Web API 跨域
【发布时间】:2014-01-23 09:27:39
【问题描述】:

我有一个 ASP Web API 应用程序,它使用 Web 浏览器跨域运行良好。它以 JSON 格式返回所有预期数据,我可以在 Firefox 和 Fiddler 中清楚地看到这些数据。例如,使用 Firefox:

http://mywebapidomain.com/api/drink/

返回:

<ArrayOfDrink>
    <Drink>
        <AlcoholContent>0.05</AlcoholContent>
        <Id>1</Id>
        <Name>12 oz beer</Name>
        <OuncesPerDrink>12</OuncesPerDrink>
    </Drink>
    <Drink>
        <AlcoholContent>0.12</AlcoholContent>
        <Id>2</Id>
        <Name>Glass wine</Name>
        <OuncesPerDrink>5</OuncesPerDrink>
    </Drink>
</ArrayOfDrink>

我可以使用 Fiddler 看到类似的成功。到目前为止,我有一个驻留在 Web API 域上的页面,并使用 jQuery 进行调用,如下所示:

// AJAX Call - Get Drink Types
function getDrinkTypes() {

    return $.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        url: "http://mywebapidomain.com/api/drink/",
        dataType: "json",

        success: function (data) {
            DrinkTypeList = data;
        },

        error: function (xhr, status, error) {
            alert(xhr.statusText + " - " + xhr.status + "\n\n" + xhr.responseText);
        }
    });
}

同样,这工作正常并返回了所有预期的数据。

这里没有涉及其他问题,我有充分的理由将上述 jQuery 代码放在一个完全不同的服务器/域上的脚本中。现在 Ajax 调用失败了。在检查 xhr、status 和 error 后,我看到以下内容:

xhr.readyState = 4
xhr.status = 404
xhr.statusMessage = "undefined"

status = "error"

error = ""

使用 Fiddler 查看,我看到了原始请求:

OPTIONS http://mywebapidomain.com/api/drink/ HTTP/1.1
Accept: */*
Origin: http://localhost:65103
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type, accept
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch)
Host: mywebapidomain.com
Content-Length: 0
DNT: 1
Connection: Keep-Alive
Pragma: no-cache

回应:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 23 Jan 2014 08:48:57 GMT
Content-Length: 0

我没有在 ASP/MVC4 Web API 域上配置 CORS 或 JSONP 支持。

在这个项目的早期,我遇到了这个问题并做了一些研究。我读到 jQuery Ajax 进行了 Web 浏览器没有的初始调用。我完全忘记了这叫什么,但上面来自 Fiddler 的原始请求标头中的 OPTIONS 很明显。由于我不理解它,我选择在同一个域上运行客户端 jQuery,并将其包含在备用域上的 iframe 中。这有其自身的复杂性,所以我回来解决这个问题。

有很多与这个问题相关的文章,但我一直无法理解它们。我只是不知道如何处理这个。 :S

当我一直在输入这个问题时,我看到许多类似的问题已经被问过。我已经在一个单独的窗口中打开它们并阅读了每一个,但它们似乎都没有帮助我理解我必须做什么......

有人能具体指出如何解决这个跨域 jQuery Ajax 问题吗?

【问题讨论】:

    标签: jquery asp.net ajax asp.net-mvc-4


    【解决方案1】:

    我认为你必须启用跨站点伪造请求,你有很多选项可以做到这一点 在您的回复中添加适当的标题 看看这些链接 adding header to response>

    using attributes>

    【讨论】:

    • 如果我的 jQuery Ajax 调用只向 Web API 发出 GET 请求,这是最简单的方法吗?我不需要发出任何 POST/PUT 请求。这一切似乎都是 jQuery Ajax 所必需的,因为 Web API 在 IE、Firefox 等中运行良好。需要考虑的是 jQuery 预检请求。我只是想知道是否有什么我可以做的只有 jQuery 而无需修改 ASP Web API 代码。
    • 跨站点来源允许与 asp.net 有关,事实上,当您的代码收到与您的站点无关的请求时会引发异常,因为这些我认为您必须更改您的 asp .net 代码
    猜你喜欢
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2011-08-30
    • 2014-06-28
    相关资源
    最近更新 更多