2009-11-29 146 views
1

我通过jQuery的getJson()调用来调用我的跨域Web服务。由于我的响应对象大小非常大,我已经使用了我的Web服务的最大JSon大小。我检查过getJson()是否给出了正确的响应对象。但是我的回调函数仍然没有被调用。 Firebug说它超过(firefox)响应大小。浏览器响应大小限制

任何人都可以告诉我最大浏览器响应大小限制标准浏览器例如(火狐,即)处理和如何处理该问题?

以下是相同的代码片段。

//Wrapper call to the actual getJson call 
function getResponse() { 
    var localService = new getServiceProxy("SearchData.asmx"); 
    localService.invoke("Search", "", "successcall"); 
} 

//getJson call 
function getServiceProxy(serviceUrl) { 
    var _I = this; 
    this.serviceUrl = serviceUrl; 

    // *** Call a wrapped object 
    this.invoke = function(method, data, callback, error) { 

     if (data == "") { 
      var url = _I.serviceUrl + "/" + method + "?output=json&callback=?"; 
     } 
     else { 
      url = _I.serviceUrl + "/" + method + "?" + data + "&output=json&callback=?"; 
     } 
     $.getJSON(url, function(arg) {  
      var evalstr = callback + "(" + JSON.stringify(arg) + ");"; 
      eval(evalstr); 
     }); 
    } 
} 

//success callback function 
function successcall(multiSearchResponse) { 
    //use the response. 
} 

任何帮助将不胜感激。

谢谢Subrat。

回答

0

我曾经在项目中经历过这一次,我记得IE浏览器对GET和GET请求的限制为2083个字符。 FF有一个更大的限制,但不是无限的。

http://support.microsoft.com/kb/208427

+0

POST应该没有长度限制,否则文件上传将是不可能的。另一方面,GET具有约2k的限制。 – 2012-01-19 20:22:07

0

一两件事,看起来有点怪异的是回调函数:

$.getJSON(url, function(arg) {  
    var evalstr = callback + "(" + JSON.stringify(arg) + ");"; 
    eval(evalstr); 
}); 

由于使用JSONP(由于该请求被跨域)响应服务应该返回一个JavaScript这样的:

jQueryGeneratedUniqueCallbackName12345({my: 'data', foo: 'bar'}); 

所以arg参数是实际的JavaScript对象。你不应该需要串并然后评估它。简单地使用它,因为它是

$.getJSON(url, function(data) {  
    console.log(data.foo); 
}); 

前一段我在我的博客张贴有关inner workings of JSONP,如果你有兴趣了解更多的细节,即:。

0

也许你想你的$.getJSON部分如下所示:

$.getJSON(url, function(arg) {  
    callback.apply(null, JSON.stringify(arg)); 
}); 

// Or more simply 

$.getJSON(url, function(arg) {  
    callback(JSON.stringify(arg)); 
}); 

apply一些更多的信息:MDN Docs


UPDATE:而在此之前,你也可以改变getResponse函数为:

function getResponse() { 
    var localService = new getServiceProxy("SearchData.asmx"); 
    localService.invoke('Search', '', successcall); 
}