2014-08-31 83 views
15

我一直试图通过关于CodeProject(http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room)上的“Asp.Net SignalR聊天室”教程来实现聊天室。不过,我得到错误“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 – 2015-01-01 12:07:59

+0

请看'halter73'的答案,以了解bool的用途在这里:http://stackoverflow.com/questions/24878187/signalr-detecting-alive-connection-in-c-sharp-clients – 2015-07-03 03:08:07

3

您的signalR depedency一个missmatch,他们改变了签名OnDisconnected在2.1.1

因此,所有projets升级到2.1.1或降级的所有项目2.1.0,它应该工作

+0

谢谢!我安装了2.1.1,所以降级工作。 – Palindrome 2014-09-01 16:44:55

+0

您也可以使用2.1.1并更新OnDisconnected覆盖 – Anders 2014-09-01 18:25:54

相关问题