C# &引用;OnDisconnected():找不到合适的方法来重写";-信号员

C# &引用;OnDisconnected():找不到合适的方法来重写";-信号员,c#,asp.net-mvc-5,signalr,signalr-hub,C#,Asp.net Mvc 5,Signalr,Signalr Hub,我一直在尝试通过遵循关于CodeProject()的“Asp.Net Signaler聊天室”教程来实现聊天室。但是,我得到了错误“Hubs.chatwubs.OnDisconnected():找不到合适的方法进行重写” 聊天中心类: public class ChatHub : Hub { #region Data Members static List<UserDetail> ConnectedUsers = new List<UserDetail>

我一直在尝试通过遵循关于CodeProject()的“Asp.Net Signaler聊天室”教程来实现聊天室。但是,我得到了错误“Hubs.chatwubs.OnDisconnected():找不到合适的方法进行重写”

聊天中心类:

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

}
公共类聊天中心:中心
{
#区域数据成员
静态列表ConnectedUsers=新列表();
静态列表CurrentMessage=新列表();
#端区
#区域方法
公共void Connect(字符串用户名)
{
var id=Context.ConnectionId;
if(ConnectedUsers.Count(x=>x.ConnectionId==id)==0)
{
Add(新的UserDetail{ConnectionId=id,UserName=UserName});
//发送给呼叫者
Clients.Caller.onConnected(id、用户名、ConnectedUsers、CurrentMessage);
//发送至除呼叫方客户端以外的所有客户端
Clients.AllExcept(id).onNewUserConnected(id,用户名);
}
}
public void SendMessageToAll(字符串用户名、字符串消息)
{
//在缓存中存储最后100条消息
AddMessageinCache(用户名、消息);
//广播信息
Clients.All.messageReceived(用户名、消息);
}
public void SendPrivateMessage(字符串toUserId,字符串消息)
{
字符串fromUserId=Context.ConnectionId;
var-toUser=ConnectedUsers.FirstOrDefault(x=>x.ConnectionId==toUserId);
var fromUser=ConnectedUsers.FirstOrDefault(x=>x.ConnectionId==fromUserId);
如果(toUser!=null&&fromUser!=null)
{
//寄往
Clients.Client(toUserId).sendPrivateMessage(fromUserId,fromUser.UserName,message);
//发送给呼叫方用户
Clients.Caller.sendPrivateMessage(toUserId,fromUser.UserName,message);
}
}
公共覆盖System.Threading.Tasks.Task OnDisconnected()
{
var item=ConnectedUsers.FirstOrDefault(x=>x.ConnectionId==Context.ConnectionId);
如果(项!=null)
{
连接用户。移除(项目);
var id=Context.ConnectionId;
Clients.All.onUserDisconnected(id,item.UserName);
}
返回base.OnDisconnected();
}
#端区
#区域专用消息
私有void AddMessageinCache(字符串用户名,字符串消息)
{
CurrentMessage.Add(新的MessageDetail{UserName=UserName,Message=Message});
如果(CurrentMessage.Count>100)
CurrentMessage.RemoveAt(0);
}
#端区
}

关于为什么会发生这种情况,有什么线索吗?

如果您的信号机依赖性不匹配,他们在2.1.1中更改了OnDisconnected的签名


因此,将所有项目升级到2.1.1或将所有项目降级到2.1.0,对于版本2.1.1+的更改,它应该可以工作

public override Task OnDisconnected()


谢谢我安装了2.1.1,因此降级工作正常。您也可以使用2.1.1并更新OnDisconnected覆盖,但在使用公共覆盖任务OnDisconnected(bool stopCalled)之后。它无法调用客户机方法。是否有任何解决方案。例如:在上面的示例中,回文使用
Clients.All.onUserDisconnected(id,item.UserName)因此在使用bool STOPCALLED后无法调用请参见
halter73的答案以了解bool的用途:
public override Task OnDisconnected(bool stopCalled)