我有一个带有信号的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