【问题标题】:Out Of Memory Exception while transferring files using Web Browser Control (about 10MB and greater)使用 Web 浏览器控件传输文件时出现内存不足异常(大约 10MB 或更大)
【发布时间】:2018-05-27 23:06:25
【问题描述】:

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

这适用于较小的文件,但一旦文件达到大约 10MB 或更高,就会引发 OutOfMemory 异常。

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

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)代码的sn-p:

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

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

OutOfMemory 异常发生在GetFiles() 之后尝试将 JSON 设置为 jsonFilesString

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

谢谢

【问题讨论】:

  • 你的文件路径是什么File.ReadAllBytes(file.FilePath); 你试过添加File.ReadAllBytes(@file.FilePath); 文件路径是否以反斜杠结尾"\" 还有你在哪里设置buffer size
  • 您可能正在达到系统上的最大有效字符串长度。 See What is the maximum possible length of a .NET string? 了解详情。有什么办法可以避免这种情况,例如通过返回一个字符串数组而不是单个字符串?
  • @MethodMan filePath 是文件临时位置的完整路径。我没有在这里设置缓冲区。相反,我正在读取所有字节。
  • @dbc 我没有尝试过字符串数组。我必须弄清楚如何分解它(按文件或每个属性)

标签: javascript c# json serialization webbrowser-control


【解决方案1】:

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

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

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

2) 为用户提供一个表单来编辑文件属性。用户向您的服务提交更改,服务更新文件属性。

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

Achievement 是一种可扩展的解决方案,适用于超过 10MB 限制的更大文件。

【讨论】:

  • 在进行一些测试时,我在传入 JSON 时将文档属性与文件分开。不幸的是,这并没有什么不同,因为与文件字节相比,文档属性使用的内存太少了。在这一点上,这个过程的完全返工可能是不可能的。我们需要一种更好的方法来通过 WebBrowserControl 传输文件,而不是通过字符串传输字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 2018-01-13
  • 1970-01-01
相关资源
最近更新 更多