2014-08-31 18 views
15

Próbowałem zaimplementować pokój czatu, korzystając z samouczka "Asp.Net SignalR Chat Room" na CodeProject (http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room). Jednak dostaję błąd „Hubs.ChatHubs.OnDisconnected(): nie znaleziono odpowiedniego sposobu, aby zastąpić”"OnDisconnected(): brak odpowiedniej metody, którą można zastąpić" - SignalR

klasę ChatHub:

public class ChatHub : Hub 
{ 
    #region Data Members 

    static List<UserDetail> ConnectedUsers = new List<UserDetail>(); 
    static List<MessageDetail> CurrentMessage = new List<MessageDetail>(); 

    #endregion 

    #region Methods 

    public void Connect(string userName) 
    { 
     var id = Context.ConnectionId; 


     if (ConnectedUsers.Count(x => x.ConnectionId == id) == 0) 
     { 
      ConnectedUsers.Add(new UserDetail { ConnectionId = id, UserName = userName }); 

      // send to caller 
      Clients.Caller.onConnected(id, userName, ConnectedUsers, CurrentMessage); 

      // send to all except caller client 
      Clients.AllExcept(id).onNewUserConnected(id, userName); 

     } 

    } 

    public void SendMessageToAll(string userName, string message) 
    { 
     // store last 100 messages in cache 
     AddMessageinCache(userName, message); 

     // Broad cast message 
     Clients.All.messageReceived(userName, message); 
    } 

    public void SendPrivateMessage(string toUserId, string message) 
    { 

     string fromUserId = Context.ConnectionId; 

     var toUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == toUserId); 
     var fromUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == fromUserId); 

     if (toUser != null && fromUser != null) 
     { 
      // send to 
      Clients.Client(toUserId).sendPrivateMessage(fromUserId, fromUser.UserName, message); 

      // send to caller user 
      Clients.Caller.sendPrivateMessage(toUserId, fromUser.UserName, message); 
     } 

    } 

    public override System.Threading.Tasks.Task OnDisconnected() 
    { 
     var item = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId); 
     if (item != null) 
     { 
      ConnectedUsers.Remove(item); 

      var id = Context.ConnectionId; 
      Clients.All.onUserDisconnected(id, item.UserName); 

     } 

     return base.OnDisconnected(); 
    } 


    #endregion 

    #region private Messages 

    private void AddMessageinCache(string userName, string message) 
    { 
     CurrentMessage.Add(new MessageDetail { UserName = userName, Message = message }); 

     if (CurrentMessage.Count > 100) 
      CurrentMessage.RemoveAt(0); 
    } 

    #endregion 

} 

żadnych wskazówek, dlaczego tak się dzieje?

Odpowiedz

32

Dla wersji 2.1.1+ zmienić

public override Task OnDisconnected() 

do

public override Task OnDisconnected(bool stopCalled) 
+0

Ale po użyciu trybu publicznego nadpisania Zadanie OnDisconnected (bool stopCalled). nie może wywoływać metod klienta, czy jest na to jakieś rozwiązanie. Przykład: w powyższym przykładzie Palindrome używa 'Clients.All.onUserDisconnected (id, item.UserName);' więc nie mógł wywołać po użyciu bool stopCalled –

+0

Proszę zobaczyć odpowiedź 'halter73' aby zrozumieć, jaki jest cel bool jest tutaj: http://stackoverflow.com/questions/24878187/signalr-detecting-alive-connection-in-c-sharp-clients –

3

Masz Mów mi swatka w swoim signalR zależności, zmienili podpis dla OnDisconnected w 2.1.1

więc uaktualnić wszystkie projets do 2.1.1 lub downgrade wszystkie projekty do 2.1.0 i powinno działać

+0

Dzięki! Zainstalowałem 2.1.1, więc obniżenie jakości działało. – Palindrome

+0

Można również użyć wersji 2.1.1 i zaktualizować zastąpienie OnDisconnected – Anders

Powiązane problemy