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