2017-06-02 78 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 –