即使我可以看到返回的 JSON 有效负载,对跨域的 jQuery ajax 调用也会返回状态 404

标签 jquery ajax json asp.net-web-api cross-domain

我今天花了大部分时间试图弄清楚为什么我的独立 HTML 页面中的 jQuery ajax 调用跨域 ASP.Net MVC Web API 调用返回正确的 JSON 数据,但我得到了ajax 调用的错误部分中出现以下错误消息:

对象{readyState = 4,status = 404,statusText =“错误”,更多...}

我正在使用 jQuery 2.0.3。这是我的ajax调用代码:

    $.ajax
({
    type: "GET",
    beforeSend: function (xhr, settings)
    {
        xhr.setRequestHeader("Authorization", "95d11869-a2ad-4925-8a16-ee23c82909ac");
    },
    url: url,
    dataType: "json",
    processData: false,
    crossDomain: true,
    success: function (jsonFromServer)
    {
        alert(JSON.stringify(jsonFromServer));
    },
    error: function (xhr, textStatus, errorThrown)
    {
        if (typeof console === 'object' && typeof console.log === 'function')
        {
            console.log(xhr);
            console.log(textStatus);
            console.log(errorThrown);
        }
    }       
});

我可以通过两种不同的方式验证对 WEB API 服务的调用是否正常工作:通过 Fiddler 和通过 firebug 中的网络流量选项卡。两种方式都显示对我的服务器的 2 个不同调用:预检和实际请求。 Fiddler 显示了实际的 JSON 数据结果,我已经根据 JSLint 验证了它们,并且 JSON 的格式正确。我的服务的网络流量选项卡的第二个条目指示 200 状态,但响应为空。

这是我的请求 header :

GET /api/gamelist HTTP/1.1
Host: local.XXXXXX.com
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Authorization: 95d11869-a2ad-4925-8a16-ee23c82909ac
Referer: http://127.0.0.1:52148/index.html
Origin: http://127.0.0.1:52148
Connection: keep-alive

这是我的响应 header :

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Origin: http://127.0.0.1:52148
X-AspNet-Version: 4.0.30319
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, PUT, GET, DELETE, OPTIONS
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With
Access-Control-Max-Age: 86400
Date: Fri, 04 Oct 2013 20:22:43 GMT
Content-Length: 683

我读过很多帖子并看到人们说有效的示例。我不确定我做错了什么。请问有人有见解吗?

更新

我打开了 Firefox 的 WebDeveloper Network 工具来监控请求的传输。我注意到它向我的服务器报告以下跨域调用:

语法错误:JSON.parse:数据意外结束。

这是我通过 fiddler 获得的服务调用返回的 JSON 数据:

{"Player":{"PersonId":33,"PersonName":"Anonymous User","UserKey":"95D11869-A2AD-4925-8A16-EE23C82909AC","EmailAddress":"unknown"},"GameList":[{"GameId":17,"QuestionTypeId":1,"QuestionTypeName":"Baseball","QuestionId":6,"QuestionName":"Basbeball Team Names","GameTypeId":2,"GameTypeName":"Solo","TotalAvailablePoints":141,"StartDate":"2013-10-04T11:17:10.277","WhosTurnIsItId":33,"WhosTurnName":"Anonymous User"},{"GameId":18,"QuestionTypeId":1,"QuestionTypeName":"Baseball","QuestionId":3,"QuestionName":"World Series Winners","GameTypeId":2,"GameTypeName":"Solo","TotalAvailablePoints":149,"StartDate":"2013-10-04T11:17:10.277","WhosTurnIsItId":33,"WhosTurnName":"Anonymous User"}]}

我已将此 JSON 粘贴到 JSLint 中,它表明它的格式正确。我不确定发生了什么事。有什么见解吗?

最佳答案

我也遇到了这个问题,解决方法如下:

  • 在 AJAX 调用中将数据类型从 'json' 更改为 'jsonp'
  • 将此 NuGet 包添加到 Web API 项目:WebApiContrib.Formatting.Jsonp
  • 通过从 Global.asax 调用来注册 JsonpFormatter:

    configuration.Formatters.Insert(0, new JsonpMediaTypeFormatter(configuration.Formatters.JsonFormatter));
    

问题是 Web API 不知道如何表达 jsonp,这是唯一可以在跨域 AJAX 调用中使用的数据类型。

关于即使我可以看到返回的 JSON 有效负载,对跨域的 jQuery ajax 调用也会返回状态 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19190207/

相关文章:

javascript - 传递一个 jquery 变量

c# - 具有多个参数的 WCF Rest GET

javascript - Flex Grid 未在 Orchard CMS 中呈现

jquery - 如何使 div 覆盖背景图像?

javascript - 使用jQuery测试数组中是否存在具有属性的对象

ruby-on-rails - 索引中的 Ajax 编辑页面

jquery - 除了完成和失败之外,$.ajax 是否还有第三个选项?

json - 当变量在 Swift 中作为 AnyObject 传入时,字典键和值丢失引号 ("")

asp.net - JSON.net linq无法使用where语句选择节点

jquery - 如何使用 jQuery 在每次点击时添加边距?