向Web API发送大型javascript数组
Sending large javascript array to Web API
我已经为这个问题挣扎了两天。。。
我有一个JavaScript数组(20000K行和41列)。它最初是通过如下所示的ajax调用在javaScript中接收的,
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)发送回webapi方法,但失败了。请参阅下面的代码,
选项1:(失败-请求未命中web 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 将相同的值发送到web api
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,我看到的内容长度为"128180309"。但是,我看不出有什么价值。如何获取Web API中的值?
请建议我如何从javascript将大数据发送回webapi。
谢谢,Vim
我认为你会产生开销,也许我错了,你可以编辑我。你真的需要发回所有数据吗?还是只需要发送修改后的数据?因为在现实生活中,很难想象用户会查看20000行。
ExtJS商店就是一个很好的例子,你可以在这里看到这个例子关键是存储他们只发送回服务器修改或删除的数据,它节省了浏览器、网络和服务器资源。
尝试为API或更多时间执行添加更多内存,也可以尝试返回更多小部分的数据。定义要发送的零件数。
您是否尝试过按块发送数据?我的意思是,你需要把它分成小块,并执行多个请求。
例如,它可以像:
--HELLO SERVER. STARTING TRANSMITION FOR DATA SET #177151--
PIECE 1/13
PIECE 2/13
...
PIECE 13/13
--BUE SERVER--
因此,这将需要一些时间,但您可以在没有内存问题的情况下发送任何数量的数据。如果你已经挣扎了两天,我想你有一些时间来编码它:)
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);
}
});
}
}
- javascript中网络图表的大型数据集
- 如何在大型php网站中组织一个小javascript
- 用于组织大型javascript应用程序的工具和最佳实践
- 关于重构大型JavaScript方法的建议
- 向Web API发送大型javascript数组
- 加载一个大型 JavaScript 文件与多个整体大小较小的较小文件的性能
- 从 JSON(db 查询结果)加载大型 javascript 数组而不会使页面崩溃
- 在本地主机上运行时在 Opera 中截断的大型 JavaScript 文件
- 如何构建一个大型 JavaScript 应用程序
- 命名空间大型JavaScript,如jQuery
- 我应该如何组织一个大型JavaScript对话框对象
- 如何避免重新加载大型JavaScript数组
- 在Visual Studio中查找大型javascript文件中的语法错误
- 如何用RequireJS拆分大型Javascript文件
- 解析一个大型javascript对象
- 大型javascript需要加载并转换为xml对象
- 单元测试-开发大型JavaScript应用程序的最佳实践
- 通过AJAX加载大型Javascript数组
- 使用cakephp在前端放置/生成大型javascript数据文件的位置
- 减少大型javascript操作对客户端明显滞后的方法