【问题标题】:How to read large string from sessionStorage in Blazor WebAssembly? My result is truncated如何从 Blazor WebAssembly 中的 sessionStorage 读取大字符串?我的结果被截断
【发布时间】:2020-12-16 02:53:12
【问题描述】:

我正在开发一个新的 Blazor WebAssembly 应用程序 (NET 5.0),但在从会话存储中读取大字符串(约 3000 个字符)时遇到问题。我得到了一个结果,但它被截断并在中间添加了一个“...”。结果总是正好 1000 字节。

在下面的代码中,dataKey 是我要读取的数据的字符串键。 JSRuntime 像这样注入:

@inject IJSRuntime JSRuntime

我第一次尝试从会话存储中读取项目如下所示:

// Initial try (truncated)
var myValue1 = await JSRuntime.InvokeAsync<string>("sessionStorage.getItem", dataKey);

然后搜索了一下,发现建议不要在webassembly中等待,所以我改成这样:

// Remove the await (still truncated)
var myValue2 = ((IJSInProcessRuntime)JSRuntime).Invoke<string>("sessionStorage.getItem", dataKey);

这给了我一个相同的结果,一个正好 1000 字节的截断字符串。

在阅读更多内容后,我发现建议在某些情况下使用 Unmarshalled 调用。我试过了,但我的结果只是空的。我找不到这个用例的清晰示例,所以我的代码可能不正确。

// Unmarshalled (null)
var myValue3 = ((IJSUnmarshalledRuntime)JSRuntime).InvokeUnmarshalled<string, object>("sessionStorage.getItem", dataKey);

经过大量搜索后,我找不到任何其他建议。谁能帮我从会话存储中读取这个字符串?

谢谢!

【问题讨论】:

    标签: blazor-webassembly .net-5


    【解决方案1】:

    我创建了一个页面,在该页面上初始化一个随机值被写入会话存储。单击按钮时,将读取该值并与预期值进行比较。结果显示出来,是真的。我已经在各种浏览器中进行了测试。

    但是,这里有一种特殊的行为。如果您在 Visual Studio 中使用调试器(尚未在 vs 代码中进行测试,但假设它们的行为相同),您只会看到 1000 个字符,即使您的字符串有很多更多。在示例中,只需注释 &lt;p&gt; 标记即可查看,显示 10,000 个字符,但调试器仅显示 1,000 个。

    
    @page "/sessionStorage"
    @inject IJSRuntime js
    
    <h1>SessionStorage</h1>
    
    @if (isSame.HasValue == true)
    {
      @*<p>@_expectedSessionValue</p>*@
        <p>Result: @isSame</p>
    }
    
    <button class="btn btn-primary" @onclick="ReadSessionStorage">Click me</button>
    
    @code {
        private Boolean? isSame = null;
    
        private String _expectedSessionValue = "";
        private String _sessionKey = "key1";
    
    
        protected async override Task OnInitializedAsync()
        {
            Random random = new Random(12345);
    
            Char[] content = new char[10000];
            for (int i = 0; i < content.Length; i++)
            {
                content[i] = (Char)('a' + random.Next(0, 26));
            }
    
            _expectedSessionValue = new string(content);
    
            await js.InvokeVoidAsync("sessionStorage.setItem", new[] { _sessionKey, _expectedSessionValue });
    
            base.OnInitialized();
        }
    
        protected async Task ReadSessionStorage()
        {
            await base.OnParametersSetAsync();
    
            String value = await js.InvokeAsync<String>("sessionStorage.getItem", new[] { _sessionKey });
    
            isSame = value == _expectedSessionValue;
            StateHasChanged();
        }
    
    }
    
    
    

    【讨论】:

    • 非常感谢!我正在使用调试器,所以这很有意义。我将文本打印到屏幕上,这是我正在寻找的全文。我以前从未在调试器上遇到过这个问题,但绝对是我将来会牢记的!再次感谢,我在这上面浪费了太多时间!
    • 不客气 这是一个非常有趣的问题。在初稿中,我写了类似“我无法重现您的错误”的内容,但后来我在调试器中查看并找到了它。 :)
    猜你喜欢
    • 2014-05-07
    • 1970-01-01
    • 2021-09-15
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多