Blazor预览9 / mono-wasm内存访问超出范围:DotNet.invokeMethod的最大字符串大小?

时间:2019-09-14 18:12:01

标签: .net-core mono blazor

从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)

我需要处理代表文件内容的大字符串。

  1. 有没有办法提高这个限制?
  2. 除了将字符串分成多个段并执行多次调用外,还有其他方法可以处理大字符串吗?
  3. 还有其他处理大文件的方法吗?

这曾经在预览版8中起作用。

2 个答案:

答案 0 :(得分:2)

  
      
  1. 有没有办法提高这个限制?
  2.   

否(除非您修改并重新编译blazor和mono / wasm)。

  
      
  1. 除了将字符串分成多个段并执行多次调用外,还有其他方法可以处理大字符串吗?
  2.   

是的,就像在客户端一样,您可以使用共享内存技术。您基本上将.net byte[]映射到ArrayBuffer。请参阅this(免责声明:我的库)或this库以获取有关如何执行此操作的参考。这些示例使用的是实际JavaScript File的二进制内容,但它也适用于字符串。这些API尚无参考文档。通常只是示例和blazor source code

  
      
  1. 还有其他处理大文件的方法吗?
  2.   

请参阅2)

答案 1 :(得分:1)

我在netcore 3.2 Blazor应用程序中重新创建了您的问题(如您所描述的那样,介于1到2 Mb的数据会杀死它)。我将应用程序更新为netcore 5.0,此问题已解决(当我向其扔50Mb时,它仍在工作)。