2014-12-07 149 views
2

我是新使用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; 
    } 

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

+0

'Clients.Client(connectionId).addChatMessage(name +“:”+ message);'in javascript'chat.client.addChatMessage = function(name,message )'c sharp call should be'Clients.Client(connectionId).addChatMessage(name,message);' – Moes 2014-12-07 23:52:55

回答

0

如果我正确理解你,你可以发送消息给特定的用户这样。

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); 
} 

而“string who”应该是接收用户的用户名。希望这个帮助。

+0

不正确,我可以发送消息给特定用户(他得到消息),但是这个用户不能发回消息给我。而且我没有看到我发送给用户的消息,只是他看到了消息。我想在两个用户之间进行对话。 – Aleksei 2014-12-08 10:51:35

0

只要改变你的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); 
     } 
    } 

这行代码是调用您的客户端,你已经写在查看

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

的功能没有得到addChatMessage方法因为您从cs页面提供的参数与客户端方法的预期不同。

您的通话

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

PARAMS通过客户端方法

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

你提供因而没有得到映射一个参数的预期。

如果仍然问题仍然存在尝试检查_connections字典在SendChatMessage方法的唯一原因的消息不会回来给你的是,如果你的连接ID没有被添加到这个字典中这是不可能的,因为这是第一步只要您在OnConnected事件中运行应用程序,就会发生这种情况