2014-08-31 10 views
15

Ho cercato di implementare una chat room seguendo il tutorial "Asp.Net SignalR Chat Room" su CodeProject (http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room). Tuttavia, sto ottenendo l'errore "Hubs.ChatHubs.OnDisconnected(): nessun metodo adeguato trovato per eseguire l'override""OnDisconnected(): nessun metodo idoneo trovato in override" - SignalR

classe 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 

} 

Degli indizi sul motivo per cui questo sta accadendo?

risposta

32

per la versione 2.1.1+ cambiare

public override Task OnDisconnected() 

a

public override Task OnDisconnected(bool stopCalled) 
+0

, ma dopo aver utilizzato l'override pubblico Task OnDisconnected (bool stopCalled). non è in grado di chiamare i metodi client, esiste una soluzione per questo. Esempio: in esempio sopra Palindrome usa 'Clients.All.onUserDisconnected (id, item.UserName);' quindi non è stato possibile chiamare dopo aver usato bool stopCalled –

+0

Vedere la risposta di 'halter73' per capire quale sia lo scopo del bool è qui: http://stackoverflow.com/questions/24878187/signalr-detecting-alive-connection-in-c-sharp-clients –

3

Hai un missmatch nel vostro di dipendenze signalR, hanno cambiato la firma per OnDisconnected in 2.1.1

Quindi aggiornare tutti projets a 2.1.1 o downgrade tutti i progetti a 2.1.0 e dovrebbe funzionare

+0

Grazie! Avevo 2.1.1 installato, quindi il downgrade funzionava. – Palindrome

+0

È inoltre possibile utilizzare 2.1.1 e aggiornare l'On Ignorato sovrascritto – Anders