2015-02-05 71 views
1

我在这个问题上挣扎了2天...我有一个JavaScript数组(20,000K行和41列)。它最初是通过Ajax调用接受在JavaScript中,如下图所示,发送大的JavaScript数组到Web API

var dataArray = []; 
var dataRequest = {}; 
      dataRequest.SearchCondition = 'some value'; 
      $.ajax({ 
       type: "POST", 
       url: "api/GetData/ProcessRequest",    
       dataType: 'json', 
       cache: false, 
       async: true, 
       crossDomain: false, 
       data: dataRequest , 
       success: function (response) { 
        dataArray = response; 
       }, 
       error: function (xhr, textStatus, errorThrown) { 
        dataArray = null; 
       } 
      }); 

在应用中,用户将验证数据和发送回的Web API方法。

我想发送相同的数据(dataArray)到web api方法,但它失败。请参阅下面的代码,

选项1:(失败 - 请求未命中的网络API方法)

var dataArrayJsonStr = JSON.stringify(dataArray);      

    $.ajax({ 
     type: "POST", 
     url: "api/SendData/ProcessRequest", 
     dataType: 'json', 
     data: {'dataValue':dataArrayJsonStr }, 
     success: function (response) { 
      alert('success'); 
     }, 
     error: function (xhr, textStatus, errorThrown) { 
      alert(errorThrown) 
     } 
    }); 

在IE 8中,我得到“内存不足”异常弹出。 (我们大多数的应用用户仍然拥有IE 8)

在Chrome中,它崩溃了。

选项2尝试:(不知道如何读的值)

我试图通过XmllHttpRequest

var dataArrayJsonStr = JSON.stringify(dataArr); 
      var xmlRequest; 
      if (window.XMLHttpRequest) { 
       xmlRequest = new XMLHttpRequest();     
      } 
      xmlRequest.open("POST", "api/SendData/ProcessRequest", false); 
      xmlRequest.setRequestHeader('Content-Type', 'application/text'); 
      xmlRequest.send("dataValue=" + dataArrayJsonStr); 

使用Chrome发送相同值的Web API,我能够发布数据成功发布到Web API,我看到内容长度为'128180309'。但是,我没有看到价值。我如何获得Web API中的值?

请教我如何从javascript发送大数据到网页api。

感谢, Vim的

回答

0

尝试添加更多的内存API或更多的时间excecution,你也可以尝试返回多个小部件的数据。定义要发送的部件数量。

+0

您能否提供我的代码示例或引用文章以小部分返回数据? – Vim 2015-02-05 19:06:32

+0

我将搜索一篇文章,但更多的是逻辑,你从数组中获得长度然后 var numbers_object = object/1000(registres); 并执行每个响应或对于 我搜索一个示例或创建一个想法 – hfloresv 2015-02-05 19:29:19

+0

在这种情况下,如何在Web API中接收数据并将它们设置为单个对象? – Vim 2015-02-05 20:57:39

0

您是否尝试通过块发送数据? 我的意思是,你需要将它分成小块并执行多个请求。

例如,它可以像:

--HELLO SERVER. STARTING TRANSMITION FOR DATA SET #177151-- 
PIECE 1/13 
PIECE 2/13 
... 
PIECE 13/13 
--BUE SERVER-- 

因此,它需要一定的时间,但你可以发送任何数据量没有内存问题。如果你为它挣扎了2天,我认为你有一段时间来编码它:)

UPD1:客户端代码示例。

下面是一个客户端代码示例。这是一个简单的分块算法。 不得不说我没有测试它,因为它会花很多时间来表示你的情况。

所以,你应该阅读它并明白这一点。 您有一个简单的功能,它可以为您的每个响应提供整个数据集和回调(例如更新进度条),以便成功完成和出错。

希望能帮助你解决一些问题。 另外,我可以帮助您在服务器端构建架构,但我需要知道您使用的是什么技术。

function sendData(data, onEach, onFinish, onError) { 
    var CHUNK_SIZE = 1000; 
    var isFailed = false; 
    var chunkNum = 0; 
    var chunk, chunkStart, chunkEnd; 

    while(data.length + CHUNK_SIZE > chunkNum * CHUNK_SIZE) { 
     if(isFailed) { 
      return; 
     } 
     chunkStart = chunkNum * CHUNK_SIZE; 
     chunkEnd = chunkStart + CHUNK_SIZE + 1; 

     chunk = { 
      num: chunkNum, 
      data: data.slice(chunkStart, chunkEnd) 
     }; 

     ajaxCall(chunk); 
     chunkNum++; 
    } 

    function ajaxCall(data) { 
     $.ajax({ 
      type: "POST", 
      url: "api/GetData/ProcessRequest",    
      dataType: 'json', 
      async: true, 
      data: dataRequest , 
      success: function (response) { 
       onEach(data, response); 
      }, 
      error: function (xhr, textStatus, errorThrown) { 
       isFailed = true; 
       onError(arguments); 
      } 
     }); 
    } 


} 
+0

此外,您可以发送当前块的数量与整个请求并异步发送所有请求。然后服务器将能够在接收到最后一张时按正确顺序构建正确的数据集 – 2015-02-05 19:05:34

+0

感谢您的建议。我没有尝试通过块发送数据。你能提供我的代码示例吗? – Vim 2015-02-05 19:08:54

+0

更新了我的答案。 – 2015-02-06 08:25:24

1

我认为你创造了开销,也许我错了,你可以编辑我。 你真的需要回发所有数据吗?或者你只需​​要发送修改过的数据? 因为在现实生活中很难想象用户会查看20.000行。

很好的例子是ExtJS商店,你可以看到例子here 他们发回给服务器的修改或删除数据的关键是保存浏览器,网络和服务器资源。

+0

我必须发回所有数据。 – Vim 2015-02-05 20:54:26