无法在信号器内部调用 Web API 控制器断开连接的方法



我有一个带有信号的MVC Web修复,我想在发布的Web API中更新表。

调用Web API控制器以使用户在Onconnected方法中工作正常:

public override async Task OnConnected()
{ 
    var users = await _client.GetAsync("chats/users");
    Clients.All.userConnected();
}

但是,当我将代码放入OnDisconnected方法中时,它给了我一个错误:

public override async Task OnDisconnected(bool stopCalled)
{
     var users = await _client.GetAsync("chats/users");
}

为什么会发生这种情况?这是整个Hub代码:

private static IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
private HttpClient _client;
public ChatHub()
{
    AccessDelegatingHandler handler = new AccessDelegatingHandler();
    _client = HttpClientFactory.Create(handler);
    _client.BaseAddress = new Uri(ClsConfig.GetConfiguration().APIBaseAddress);
}
// Send new message to group chat.
public static void SendGroupMessage(MessageDetailModel messageDetail)
{
    hubContext.Clients.All.newGroupMessageReceived(messageDetail);
}
public override async Task OnConnected()
{ 
    var users = await _client.GetAsync("chats/users");
    Clients.All.userConnected();
}
public override Task OnReconnected()
{
    return base.OnReconnected();
}
public override async Task OnDisconnected(bool stopCalled)
{
    var users = await _client.GetAsync("chats/users");
}

编辑:我发现,当我将var user = Context.User.Identity;放置在OnDisconnected方法中时,用户是IsAuthenticated = true,但是当我在AccessDelegatingHandler类中放置一个断点时,var identity = (ClaimsIdentity)HttpContext.Current.User.Identity;行会产生错误,并且是IsAuthenticated = false

到遇到事件发生的事件发生时,您可能已经断开连接,并且不能保证您的代码会运行(SignalR的已知问题(,您是否也在监视陷入困境在客户端还是服务器中?看起来您正在尝试从服务器处理它,并且应该从客户端处理。

此链接应有助于了解为什么这样。

https://learn.microsoft.com/en-us/aspnet/signalr/signalr/signalr/guide-to-to-to-the-the-api/handling-connection-connection-lifetime-events-events#clientdisconnect

最新更新