2

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

谁能告诉我标准浏览器例如(firefox,ie)处理的最大浏览器响应大小限制是多少以及如何处理这个问题?

这是相同的代码片段。

 //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.
 }

任何帮助将不胜感激。

谢谢苏拉特。

4

3 回答 3

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);
 });

不久前,如果您对更多细节感兴趣,我在我的博客上发布了有关JSONP 的内部工作原理的文章。

于 2009-11-29T08:32:01.463 回答
0

我在一个项目中经历过一次,我记得 IE 对于 POST 和 GET 请求都有 2083 个字符的限制。FF有更大的限制,但不是无限的。

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

于 2009-11-29T09:58:40.207 回答
0

也许您希望您的$.getJSON零件如下所示:

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

// Or more simply

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

有关以下内容的更多信息applyMDN 文档


更新:在此之前,您还可以将getResponse功能更改为:

function getResponse() {
    var localService = new getServiceProxy("SearchData.asmx");
    localService.invoke('Search', '', successcall);
}
于 2011-10-16T10:26:54.247 回答