从dotnet core 3预览版9开始,我遇到了调用dotnet方法从JavaScript传递大字符串的问题。
代码值超过一千个单词,因此下面的代码片段重现了该问题。它在length = 1 * mb
时有效,但在length = 2 * mb
时失败。
@page "/repro"
<button onclick="const mb = 1024 * 1024; const length = 2 * mb;console.log(`Attempting length ${length}`); DotNet.invokeMethod('@GetType().Assembly.GetName().Name', 'ProcessString', 'a'.repeat(length));">Click Me</button>
@functions {
[JSInvokable] public static void ProcessString(string stringFromJavaScript) { }
}
错误消息是:
Uncaught RuntimeError: memory access out of bounds
at wasm-function[2639]:18
at wasm-function[6239]:10
at Module._mono_wasm_string_from_js (http://localhost:52349/_framework/wasm/mono.js:1:202444)
at ccall (http://localhost:52349/_framework/wasm/mono.js:1:7888)
at http://localhost:52349/_framework/wasm/mono.js:1:8238
at Object.toDotNetString (http://localhost:52349/_framework/blazor.webassembly.js:1:39050)
at Object.invokeDotNetFromJS (http://localhost:52349/_framework/blazor.webassembly.js:1:37750)
at u (http://localhost:52349/_framework/blazor.webassembly.js:1:5228)
at Object.e.invokeMethod (http://localhost:52349/_framework/blazor.webassembly.js:1:6578)
at HTMLButtonElement.onclick (<anonymous>:2:98)
我需要处理代表文件内容的大字符串。
这曾经在预览版8中起作用。
答案 0 :(得分:2)
- 有没有办法提高这个限制?
否(除非您修改并重新编译blazor和mono / wasm)。
- 除了将字符串分成多个段并执行多次调用外,还有其他方法可以处理大字符串吗?
是的,就像在客户端一样,您可以使用共享内存技术。您基本上将.net byte[]
映射到ArrayBuffer
。请参阅this(免责声明:我的库)或this库以获取有关如何执行此操作的参考。这些示例使用的是实际JavaScript File
的二进制内容,但它也适用于字符串。这些API尚无参考文档。通常只是示例和blazor source code。
- 还有其他处理大文件的方法吗?
请参阅2)
答案 1 :(得分:1)
我在netcore 3.2 Blazor应用程序中重新创建了您的问题(如您所描述的那样,介于1到2 Mb的数据会杀死它)。我将应用程序更新为netcore 5.0,此问题已解决(当我向其扔50Mb时,它仍在工作)。