2017-06-02 8 views
1

私はsignalvでmvc Webアプリケーションを持っており、公開されたWeb APIのテーブルを更新したいと思います。シグナルの内部でWeb APIコントローラを呼び出すことができませんOnDisconnectedメソッド

正常に動作しますOnconnectedメソッド内のユーザーを取得するには、ウェブAPIコントローラを呼び出す:

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コードです:私は私がOnDisconnectedメソッド内var user = Context.User.Identity;を置いたときに、ユーザーがIsAuthenticated = trueですが、私はAccessDelegatingHandlerクラス内のブレークポイントを配置するときvar identity = (ClaimsIdentity)HttpContext.Current.User.Identity;ラインが与えることが判明 :

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"); 
} 

はEDIT 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を更新することです –

関連する問題