ASP.NET WebアプリケーションでSignalRを使用しています。ここでは、IHubContext
を使用して外部からハブクラスにクライアントを呼び出しています。現在のユーザーにのみメッセージを送信するには、現在のユーザーの接続IDを取得する必要があります。クライアント側で接続IDを取得するにはどうすればよいですか?
うん。 $.connection.hub.id
を使用できます。
別の方法もあります。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
}
サーバー: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を抽出できます。 (完璧なソリューションになるには)
これは私のために働く:
var hub = $.connection.someHub;
// After connection is started
console.log(hub.connection.id);
.NETクライアントの場合、Connection
に継承され、HubConnection
オブジェクトにあります。
Connection.ConnectionId
したがって、通常は
hubConnection.ConnectionId
次のコードを使用してください。
ハブクラス。
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();
完全なハブURLを取得するには、次のように言うことができます:_hubConnection.connection.transport.webSocket.url
_
これは次のようなものです:_"wss://localhost:1234/myHub?id=abcdefg"
_
IDを取得する正規表現:
var r = /.*\=(.*)/ var id = r.exec(url)[1]