2014-08-31 1 views
15

Я пытался внедрить чат-комнату, следуя учебному пособию «CodePreject Asp.Net SignalR» по CodeProject (http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room). Тем не менее, я не получаю ошибку «Hubs.ChatHubs.OnDisconnected(): нет подходящего метода найденную переопределить»«OnDisconnected(): не найдено подходящего метода для переопределения» - SignalR

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 

} 

Любые подсказки относительно того, почему это происходит?

ответ

32

Для версии 2.1.1+ изменить

public override Task OnDisconnected() 

к

public override Task OnDisconnected(bool stopCalled) 
+0

Но после использования открытого переопределения Task OnDisconnected (bool stopCalled). он не может вызвать клиентские методы, есть ли какое-либо решение для этого. Пример: в приведенном выше примере Palindrome использует 'Clients.All.onUserDisconnected (id, item.UserName);' поэтому он не смог позвонить после использования bool stopCalled –

+0

Пожалуйста, см. Ответ 'halter73', чтобы понять, что цель bool находится здесь: http://stackoverflow.com/questions/24878187/signalr-detecting-alive-connection-in-c-sharp-clients –

3

У вас есть missmatch в вашем signalR depedency, они изменили подпись для OnDisconnected в 2.1.1

Таким образом обновить все PROJETS 2.1.1 или понизить все проекты 2.1.0 и он должен работать

+0

Спасибо! У меня был 2.1.1 установлен, поэтому работа понижалась. – Palindrome

+0

Вы также можете использовать 2.1.1 и обновить переопределение OnDisconnected – Anders