Blazor.NET:是什么导致 JavaScript 中的“任务被取消”

bae*_*999 8 blazor

我有一个带有库的服务器端 Blazor.NET 应用程序(dotnet core 3.1): ProtectedBrowserStorage ( https://www.nuget.org/packages/Microsoft.AspNetCore.ProtectedBrowserStorage ) 用于客户端浏览器中的加密存储

有时我的日志文件中会出现如下错误:

2020-04-01 14:05:17.4809 Error System.Threading.Tasks.TaskCanceledException: A task was canceled.
   at Microsoft.JSInterop.JSRuntime.InvokeWithDefaultCancellation[T](String identifier, Object[] args)
   at Microsoft.AspNetCore.ProtectedBrowserStorage.ProtectedBrowserStorage.GetAsync[T](String purpose, String key)
   at PegasusV6.LocalStorageService.LoadBasket(MenuDTO menu) in LocalStorageService.cs:line 40 A task was canceled. 
Run Code Online (Sandbox Code Playgroud)

我的问题是我不知道是什么导致了 JavaScript 调用中的这个错误。

是否有可以修复此类错误的服务器限制?

或者是客户端用户可能没有良好的互联网速度/连接,这是服务器端 Blazor 非常需要的?

希望有人能给我一个提示或任何可以改进它的东西。这是调用的 C# 函数:

    public async Task LoadBasket(MenuDTO menu)
    {
        try
        {
            AppState.BasketData = await ProtectedLocalStore.GetAsync<BasketState>($"Basket_{My.StoreId}") ?? new BasketState();
        }
        catch (Exception ex)
        {
            My.Log.Error(ex);
            AppState.BasketData = new BasketState();
        }
    }
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 5

传入中心消息的大小有一个默认最大值。我第一次遇到这个问题时,我尝试更改blazor hub的ApplicationMaxBufferSizeTransportMaxBufferSize,但没有解决问题。

而是添加 SignalR 服务并设置 MaximumReceiveMessageSize。

        services.AddSignalR(e => {
            e.MaximumReceiveMessageSize = 1000;
        });
Run Code Online (Sandbox Code Playgroud)

https://docs.microsoft.com/en-gb/aspnet/core/signalr/configuration?view=aspnetcore-3.0&tabs=dotnet#configure-server-options

希望这可以帮助。

  • 使用普通 Blazor,我用以下方法修复了此问题: `services.AddServerSideBlazor().AddHubOptions(hub =&gt; hub.MaximumReceiveMessageSize = 100 * 1024 * 1024); // 100 MB` (4认同)

Pas*_* R. 5

我有时会在 JsInterop 调用没有返回值的 javascript 方法时遇到该错误。我了解到,最好始终返回一个值,即使对于业务逻辑来说不是必需的。

在 blazor 页面中看起来像这样:

await JSRuntime.InvokeAsync<bool>("exampleJsMethod");
Run Code Online (Sandbox Code Playgroud)

然后在JS中:

window.exampleJsMethod = () => {
    //do something
    return true;
}
Run Code Online (Sandbox Code Playgroud)