【发布时间】: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