使用Web浏览器控件传输文件时出现内存不足(大约10MB或更大)

时间:2017-12-13 23:12:42

标签: javascript c# json serialization webbrowser-control

我们的产品使用Web浏览器控件将本地文件直接导入我们的网络应用程序。当用户单击软件上的“导入”时,所选文件将保存到临时文件,然后Web浏览器控件将打开到导入文件的Web应用程序。用户可以在那里编辑Web应用程序中的属性。

这适用于较小的文件,但一旦文件达到大约10MB且更高,则抛出OutOfMemory异常。

以下是我们用于检索文件并将文件传递到Web应用程序的代码的简化:

public string GetFiles() {
   List<DmFile> dmFiles = new List<DmFile>(); // DmFile is a class containing the file bytes and other document information
   foreach (var file in ImportFiles) { // ImportFiles contains the list of class ImportFile
      byte[] fileBytes = File.ReadAllBytes(file.FilePath);
      DmFile dmFile = new DmFile(file.Name, fileBytes);
      dmFiles.Add(dmFile);
   }
   string jsonList = JsonConvert.SerializeObject(dmFiles);
   return jsonList;
}

GetFiles()序列化文件列表并将JSON传递给视图模型。

以下是视图模型(javascript)代码的片段:

var webControl: any = window.external;
var jsonFilesString = webControl.GetFiles();

我们使用window.external调用Web浏览器控件。然后我们直接从Javascript代码调用GetFiles()方法来检索JSON,这样我们就可以使用文件字节。

GetFiles()尝试将JSON设置为jsonFilesString时,会发生OutOfMemory异常。

我们可以在哪里优化以允许这些更大的文件大小,或者这是对我们的文件传输方法的限制(通过WebBrowserControl传递JSON)?

由于

1 个答案:

答案 0 :(得分:1)

使用当前传输文件数据的方式无法解决此问题。 您正在使用大量内存将所有这些字节转换为字符串。

建议重新安排应用程序以使用不需要将byte []转换为字符串的模式。

1)分开保存文件和编辑文件属性的过程。

2)提供用户编辑文件属性的表单。用户提交对服务,服务更新文件属性的更改。

3)仅当用户需要保存二进制文件时才返回二进制文件(下载它)。

成就是一个可扩展的解决方案,适用于超过10MB限制的大型文件。