【问题标题】:Signalr: Cannot send message back when user send message for specific userSignalr:当用户为特定用户发送消息时无法发回消息
【发布时间】:2015-08-10 13:42:43
【问题描述】:

我是使用SignalR 的新手。当我向特定用户发送消息时:

  1. 我没有收到消息(我没有在屏幕上看到它)。
  2. 用户收到通知不能发回消息。

这意味着发送消息只能在一个方向。 如何让两个用户互相发送消息?**

我使用的是我的课程:

[HubName("TSChatHub")]
[Authorize]
public class ChatHub : Hub
{

    private readonly static ConnectionMapping<string> _connections =
        new ConnectionMapping<string>();

    public void SendChatMessage(string who, string message)
    {
        string name = Context.User.Identity.Name;

        foreach (var connectionId in _connections.GetConnections(who))
        {
            Clients.Client(connectionId).addChatMessage(name + ": " + message);
        }
    }

    public override Task OnConnected()
    {
        string name = Context.User.Identity.Name;

        _connections.Add(name, Context.ConnectionId);

        return base.OnConnected();
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        string name = Context.User.Identity.Name;

        _connections.Remove(name, Context.ConnectionId);

        return base.OnDisconnected(stopCalled);
    }

    public override Task OnReconnected()
    {
        string name = Context.User.Identity.Name;

        if (!_connections.GetConnections(name).Contains(Context.ConnectionId))
        {
            _connections.Add(name, Context.ConnectionId);
        }

        return base.OnReconnected();
    }
}

  public class ConnectionMapping<T>
{
    private readonly Dictionary<T, HashSet<string>> _connections =
       new Dictionary<T, HashSet<string>>();

    public int Count
    {
        get
        {
            return _connections.Count;
        }
    }

    public void Add(T key, string connectionId)
    {
        lock (_connections)
        {
            HashSet<string> connections;
            if (!_connections.TryGetValue(key, out connections))
            {
                connections = new HashSet<string>();
                _connections.Add(key, connections);
            }

            lock (connections)
            {
                connections.Add(connectionId);
            }
        }
    }

    public IEnumerable<string> GetConnections(T key)
    {
        HashSet<string> connections;
        if (_connections.TryGetValue(key, out connections))
        {
            return connections;
        }

        return Enumerable.Empty<string>();
    }

    public void Remove(T key, string connectionId)
    {
        lock (_connections)
        {
            HashSet<string> connections;
            if (!_connections.TryGetValue(key, out connections))
            {
                return;
            }

            lock (connections)
            {
                connections.Remove(connectionId);

                if (connections.Count == 0)
                {
                    _connections.Remove(key);
                }
            }
        }
    }
}

有我的看法:

  <div class="chatcontainer">
    <input type="text" id="message" />
    <input type="button" id="sendmessage" value="Send" />
    <input type="hidden" id="displayname" />
    <ul id="discussion">
    </ul>
</div>

 $(function () {
        // Declare a proxy to reference the hub. 
        var chat = $.connection.TSChatHub;
        debugger;
        // Create a function that the hub can call to broadcast messages.
        chat.client.addChatMessage = function (name, message) {
            // Add the message to the page. 
            $('#discussion').append('<li><strong>' + htmlEncode(name)
                + '</strong>:&nbsp;&nbsp;' + htmlEncode(name) + '</li>');
        };
        // Get the user name and store it to prepend to messages.
       // $('#displayname').val(prompt('Enter your name:', ''));
        // Set initial focus to message input box.  
        $('#message').focus();
        // Start the connection.
        $.connection.hub.start().done(function () {
            console.log('Now connected, connection ID=' + $.connection.hub.id);
            $('#sendmessage').click(function () {
                // Call the Send method on the hub. 
                chat.server.sendChatMessage($('#message').val());
                // Clear text box and reset focus for next comment. 
                $('#message').val('').focus();
            });
        }).fail(function () { console.log("Could not connect"); });
    });

 // This optional function html-encodes messages for display in the page.
    function htmlEncode(value) {
        var encodedValue = $('<div />').text(value).html();
        return encodedValue;
    }

任何人都有解决方案来帮助我

【问题讨论】:

  • Clients.Client(connectionId).addChatMessage(name + ": " + message); in javascript chat.client.addChatMessage = function (name, message) c sharp call 应该是 Clients.Client(connectionId).addChatMessage(name, message);

标签: c# jquery asp.net-mvc signalr


【解决方案1】:

如果我理解正确,您可以像这样向特定用户发送消息。

public void SendChatMessage(string who, string message)
{
    string name = Context.User.Identity.Name;

    //foreach (var connectionId in _connections.GetConnections(who))
    //{
        //Clients.Client(connectionId).addChatMessage(name + ": " + message);
    //}
    Clients.User(who).addChatMessage(name + ": " + message);
}

“字符串谁”应该是接收者用户名。希望对您有所帮助。

【讨论】:

  • 不正确,我可以向特定用户发送消息(他收到消息),但该用户无法将消息发送回我。而且我没有看到我在屏幕上发送给用户的消息,只是他看到了消息。我想在两个用户之间进行对话。
【解决方案2】:

只需更改 addChatMessage 方法的参数

 public void SendChatMessage(string who, string message)
    {
        string name = Context.User.Identity.Name;

        foreach (var connectionId in _connections.GetConnections(who))
        {
            Clients.Client(connectionId).addChatMessage(name , message);
        }
    }

这行代码正在调用你在 View 上编写的客户端 addChatMessage 方法

Clients.Client(connectionId).addChatMessage(name , message);

由于您从 cs 页面提供的参数与客户端方法预期的不同,因此函数未正确映射。

您的电话

 Clients.Client(connectionId).addChatMessage(name + ": " + message);

客户端方法期望的参数

 chat.client.addChatMessage = function (name, message) 

您提供了一个参数,因此它没有被映射。

如果问题仍然存在,请尝试在 SendChatMessage 方法中检查 _connections 字典,消息不会返回给您的唯一原因是如果您的连接 ID 未添加到此字典中,这是不可能的,因为这是在OnConnected 事件中运行应用程序时发生的第一步

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2016-11-30
    • 2016-09-19
    • 2015-04-27
    相关资源
    最近更新 更多