【问题标题】:"OnDisconnected(): no suitable method found to override" - SignalR“OnDisconnected():找不到合适的方法来覆盖”-SignalR
【发布时间】:2014-10-17 11:50:52
【问题描述】:

我一直在尝试按照 CodeProject (http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room) 上的“Asp.Net SignalR 聊天室”教程来实现一个聊天室。但是,我收到错误“Hubs.ChatHubs.OnDisconnected():找不到合适的方法来覆盖”

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

}

关于为什么会发生这种情况的任何线索?

【问题讨论】:

    标签: c# asp.net-mvc-5 signalr signalr-hub


    【解决方案1】:

    对于 2.1.1+ 版本的更改

    public override Task OnDisconnected()
    

    public override Task OnDisconnected(bool stopCalled)
    

    【讨论】:

    • 但是在使用公共覆盖任务 OnDisconnected(bool stopCalled) 之后。它无法调用客户端方法是否有任何解决方案。例如:在上面的示例中,Palindrome 使用 Clients.All.onUserDisconnected(id, item.UserName);,因此在使用 bool stopCalled 后无法调用
    • 请看halter73的回答,了解这里bool的用途是什么:stackoverflow.com/questions/24878187/…
    【解决方案2】:

    您的 signalR 依赖不匹配,他们在 2.1.1 中更改了 OnDisconnected 的签名

    所以将所有项目升级到 2.1.1 或将所有项目降级到 2.1.0,它应该可以工作

    【讨论】:

    • 谢谢!我安装了 2.1.1,所以降级工作。
    • 您也可以使用 2.1.1 并更新 OnDisconnected 覆盖
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多