如何将SignalR用户连接id放在集线器类的旁边?

时间:2013-10-18 10:57:43

标签: asp.net ajax signalr

我在ASP.NET Web应用程序中使用SignalR。在这里,我使用IHubContext从外部调用客户端到集线器类。我需要获取当前用户的连接ID,以便仅向当前用户发送消息。如何在客户端获取连接ID?

6 个答案:

答案 0 :(得分:52)

是的。您可以使用$.connection.hub.id

答案 1 :(得分:3)

还有另一种方法,您可以通过调用hub的方法从集线器获取连接ID到您的控制器,然后您可以从那里返回所需的ID

控制器代码

var HubContext = GlobalHost.ConnectionManager.GetHubContext<"ChatHub">(); //`ChatHub` can be your Hub Name
ChatHub HubObj= new ChatHub();
var RequiredId= HubObj.InvokeHubMethod();

集线器内的代码

public string InvokeHubMethod()
{
     return "ConnectionID"  //ConnectionID will the Id as string that you want outside the hub
}

答案 2 :(得分:1)

服务器: Context.ConnectionId =>“ dJSbEc73n6YjGIhj-SZz1Q”

客户:

   this._hubConnection
      .start()
      .then(() => {     
         var hub = this._hubConnection ;
         var connectionUrl = hub["connection"].transport.webSocket.url ;
         console.log(connectionUrl);

=> wss:// localhost:5001 / notify?id = dJSbEc73n6YjGIhj-SZz1Q

您可以提取ID。 (远远不是一个完美的解决方案)

答案 3 :(得分:0)

对于.NET客户端,它位于 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return searchResults.count } //MARK: Delegates func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return searchResults[row] } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { print (searchResults[row]) } func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } 对象上,由do { // Convert data returned from server to NSDictionary let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary // Cleare old search data and reload table self.searchResults.removeAll(keepingCapacity: false) // If friends array is not empty, populate searchResults array if let parseJSON = json { if let friends = parseJSON["friends"] as? [AnyObject] { for friendObj in friends { let fullName = (friendObj["nombre"] as! String) + " " + (friendObj["apellidos"] as! String) self.searchResults.append(fullName) } self.pickerAsesores.reloadAllComponents() } else if(parseJSON["message"] != nil) { // if no friends returned, display message returned from server side let errorMessage = parseJSON["message"] as? String if(errorMessage != nil) { // display an alert message self.displayAlertMessage(errorMessage!) } } } 继承。

Connection

通常可以在

上找到
HubConnection

答案 4 :(得分:0)

使用以下适用于我的代码。

在集线器课程中。

 public static ConcurrentDictionary<string, MyUserType> MyUsers = new ConcurrentDictionary<string, MyUserType>();



    public override Task OnConnected()
    {
        MyUsers.TryAdd(Context.User.Identity.Name, new MyUserType() { ConnectionId = Context.ConnectionId,UserName=Context.User.Identity.Name });
        string name = Context.User.Identity.Name;

       Groups.Add(Context.ConnectionId, name);

        return base.OnConnected();
    }
在集线器类文件中

创建以下类

public class MyUserType
{
    public string ConnectionId { get; set; }
    public string UserName { get; set; }

}

在集线器课程之外。

  var con = MyHub1.MyUsers;
       var conId =con.Select(s => s.Value).Where(s => s.UserName == User.Identity.Name).FirstOrDefault();

答案 5 :(得分:0)

要获取完整的中心网址,您可以说:hubConnection.connection.transport.webSocket.url

这类似于:"wss://localhost:1234/myHub?id=abcdefg"

正则表达式以获取ID:

var r = /.*\=(.*)/ var id = r.exec(url)[1]