2017-06-02 77 views
1

我有一个mvc web信号与signalr,我想更新发布的web api中的表。无法调用信号器OnDisconnected方法内的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

回答

0

当onDisconnected事件触发时,您可能已经断开连接,并且不能保证您的代码将运行(它与Signalr有关的已知问题)也是您监视onDisconnected在客户端还是服务器?它看起来像你试图从服务器处理它,你应该从客户端处理它。

这个链接应该有助于理解为什么这是它的方式。

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

+0

感谢您的回答,是的,我处理它在服务器上,因为这个问题是,当我处理这件事上的客户端时,浏览器或窗口被关闭,这将更新数据库的功能将不被解雇。我想要做的是更新用户IsOnline = false –