$ .getJSON在成功的http请求上失败

时间:2013-08-04 06:47:14

标签: javascript http jquery

我在我的页面中调用该方法:

var dfd = $.Deferred(
    $.getJSON(serviceAddress)
        .done(function (result, status) {
            bo.BusinessObject.DtosToaKoArray(result, resultList);
            dfd.resolve(resultList);
        })
        .fail(function (result, status) {
            logger.logError(result);
            dfd.reject(result);
        }));

return dfd; 

在调用JSON之后,firebug显示HttpRequest成功并且响应标头如下:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RDpcV29ya3NwYWNlc1xNZWhyYW5cSW5mcmFzdHJ1Y3R1cmVcTWFpblxTb3VyY2VcSW5mcmFzdHJ1Y3R1cmVcU291cmNlXENhcmFuZS5HYWxheHkuV2ViQXBpXGFwaVxEYXRhUHJvdmlkZXJcTGlzdFNlcnZpY2Vc?=
X-Powered-By: ASP.NET
Date: Sun, 04 Aug 2013 05:57:39 GMT
Content-Length: 6684

但问题是,不是done回调,而是使用此结果调用fail回调:

Object { readyState=4, status=404, statusText="error"}

我的通话未成功发送http请求有什么问题?

EDIT1。

我的网站(MyApp.Web)位于localhost:2771,而主叫服务位于localhost上的另一个项目(MyApp.WebApi)中:4143

2 个答案:

答案 0 :(得分:1)

你肯定会遇到一些障碍,试图提出跨域请求。 That includes port-to-port

解决方案还取决于服务及其支持的功能。

  • JSONP(或带有填充的JSON)

    该服务需要接受callback并输出函数调用中包含的JSON:

    // http://...?callback=completeRequest
    completeRequest(["json", "data"]);
    

    参数可以是与callback不同的名称。但是,您可以通过包含占位符参数(...=?)来指示jQuery使用它:

    $.getJSON(serviceAddress + "?callback=?")
    

    这也可以在任何浏览器中使用,因为它被<script src>请求,而JSON将被解析为JavaScript literals

  • CORS

    该服务需要支持preflight, OPTIONS requests并回复Access-Control-Allow-* headers

    此外,在most current browsers support CORS期间,如果您需要支持旧版本,则可能会受到限制。

否则,您需要在应用程序(localhost:2771)中创建一个代理目标,该目标使服务器(localhost:4143)的跨源请求服务器端。

答案 1 :(得分:0)

它可能找不到您的目标页面,这就是您可能在结果对象中获得404的原因。确保您的serviceAddress正确无误。

除此之外当您指定:dataType: 'json'如果无法将响应解析为JSON(无论200回复​​),jQuery将触发错误事件。确保从服务器返回的数据是有效的JSON,您可能希望通过JSONLint手动验证结构。

这可能是这两个问题中的任何一个。