2017-06-02 1 views
1

Ich habe eine Mvc Webapplikation mit Signal und ich möchte die Tabelle in der veröffentlichten Web API aktualisieren.Ich kann web api controller nicht innerhalb des Signalgebers aufrufen. OnDisconnected Methode

web api Controller ruft Benutzer zu erhalten innerhalb der Onconnected Methode funktioniert:

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

Aber wenn ich den Code innerhalb der OnDisconnected Methode platzieren es gibt mir eine Fehlermeldung:

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

Warum ist das passiert? dies ist der ganze Hub Code:

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: Ich fand heraus, dass, wenn ich var user = Context.User.Identity; innerhalb der OnDisconnected Methode lege der Benutzer IsAuthenticated = true, aber wenn ich einen Haltepunkt in der AccessDelegatingHandler Klasse setze die var identity = (ClaimsIdentity)HttpContext.Current.User.Identity; Linie gibt ein Fehler und ist IsAuthenticated = false

Antwort

0

Wenn das Ereignis onDisconnected ausgelöst wird, sind Sie wahrscheinlich bereits getrennt, und es gibt keine Garantie, dass Ihr Code ausgeführt wird (es ist ein bekanntes Problem mit Signaler) überwachen Sie auch die onDisconnected im Client oder im Server? Es sieht so aus, als würden Sie versuchen, es vom Server aus zu handhaben, und Sie sollten es vom Client aus behandeln.

Dieser Link sollte helfen zu verstehen, warum dies so ist.

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

+0

Vielen Dank für Ihre Antwort, und ja, ich es auf dem Server bin Handhabung, weil das Problem ist, wenn ich es auf Client-Seite behandeln, wenn der Browser oder das Fenster geschlossen war, die Funktion, die die Datenbank nicht aktualisiert wird gefeuert. Was ich versuche zu tun ist, Benutzer IsOnline = false zu aktualisieren –

Verwandte Themen