2014-08-31 82 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

相關問題