gpt4 book ai didi

signalr - Blazor WebAssembly SignalR HubConnection 在重新加载时导致 javascript 错误

转载 作者:行者123 更新时间:2023-12-05 06:48:54 24 4
gpt4 key购买 nike

我的 Blazor WebAssembly 应用程序中有一个 SignalR HubConnection,虽然它大部分时间都在工作,但如果我重新加载页面(通过浏览器重新加载),那么我经常会在控制台并且未建立连接:

Uncaught Error: The delegate target that is being invoked is no longer available. Please check if it has been prematurely GC'd.at Object.invoke_delegate (dotnet.5.0.4.js:1)at WebSocket. (dotnet.5.0.4.js:1)

这是我创建 HubConnection(并处理它)的代码的粗略简化 View 。

@inherits LayoutBase
@attribute [Authorize]

<AuthorizeView>
<Authorized>
//...
</Authorized>
<NotAuthorized>
//...
</NotAuthorized>
</AuthorizeView>
public class LayoutBase : LayoutComponentBase, IAsyncDisposable
{
[Inject] public IAccessTokenProvider AccessTokenProvider { get; set; }

private readonly HubConnection _hubConnection;

protected override async Task OnInitializedAsync()
{
_hubConnection = new HubConnectionBuilder()
.AddNewtonsoftJsonProtocol(c =>
{
//...
})
.WithUrl(notificationHubUrl, option => option.AccessTokenProvider = GetAccessToken)
.WithAutomaticReconnect()
.Build();

_hubConnection.Closed += HubConnectionOnClosed;
_hubConnection.Reconnected += HubConnectionOnReconnected;
_hubConnection.Reconnecting += HubConnectionOnReconnecting;

await _hubConnection.StartAsync()
await base.OnInitializedAsync();
}

private async Task<string> GetAccessToken()
{
var tokenResult = await AccessTokenProvider.RequestAccessToken(...)
// etc...
}

// .. Event Handlers

public ValueTask DisposeAsync()
{
_logger.LogInformation($"Disposing Hub: {_hubConnection.ConnectionId}");

_hubConnection.Closed -= HubConnectionOnClosed;
_hubConnection.Reconnected -= HubConnectionOnReconnected;
_hubConnection.Reconnecting -= HubConnectionOnReconnecting;

return _hubConnection.DisposeAsync();
}
}

以前我将它作为注入(inject)服务,但我最终将它简化为这个结构,但它在重新加载时继续出现此错误。不是每次我重新加载,而是大多数时候。

我尝试更改处置模式但没有成功。我在其他任何地方都找不到有关该错误的任何信息。

有什么想法吗?

最佳答案

对于根本原因,我没有明确的答案,但我怀疑这是一个 bug somewhere in the SignalR/dotnet framework导致委托(delegate)的垃圾回收,因为某些东西丢弃了对它的引用。

我设法合理一致地引发此错误的一种方法是让处理程序仅返回一个Task,例如

_hubConnection.On<TEvent>(eventType.Name, OnEvent);

OnEvent 看起来像这样:

// THIS IS THE BROKEN SIGNATURE - DO NOT USE
private async Task OnEvent<TEvent>(TEvent e)
{
}

似乎已为我修复它的解决方法是让处理程序实际返回一些东西。这似乎使框架中更深层次的内容持有更长时间的引用,这样它就不会被 GC 处理。例如

// WORKS ON MY MACHINE - Note the return type of Task<object>
private async Task<object> OnEvent<TEvent>(TEvent e)
{
// ... Do stuff
return null;
}

关于signalr - Blazor WebAssembly SignalR HubConnection 在重新加载时导致 javascript 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66705745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com