I need to get the connection ID of a client. I know you can get it from the client side using $.connection.hub.id
. What I need is to get in while in a web service I have which updates records in a database, in turn displaying the update on a web page. I am new to signalR and stackoverflow, so any advice would be appreciated. On my client web page I have this:
<script type="text/javascript"> $(function () { // Declare a proxy to reference the hub. var notify = $.connection.notificationHub; // Create a function that the hub can call to broadcast messages. notify.client.broadcastMessage = function (message) { var encodedMsg = $('<div />').text(message).html();// Html encode display message. $('#notificationMessageDisplay').append(encodedMsg);// Add the message to the page. };//end broadcastMessage // Start the connection. $.connection.hub.start().done(function () { $('#btnUpdate').click(function () { //call showNotification method on hub notify.server.showNotification($.connection.hub.id, "TEST status"); }); }); });//End Main function </script>
everything works up until I want to update the page using signalR. The show notification function in my hub is this:
//hub function public void showNotification(string connectionId, string newStatus){ IHubContext context = GlobalHost.ConnectionManager.GetHubContext<notificationHub>(); string connection = "Your connection ID is : " + connectionId;//display for testing string statusUpdate = "The current status of your request is: " + newStatus;//to be displayed //for testing, you can display the connectionId in the broadcast message context.Clients.Client(connectionId).broadcastMessage(connection + " " + statusUpdate); }//end show notification
how can I send the connectionid to my web service?
Hopefully I'm not trying to do something impossible. Thanks in advance.
Each client connecting to a hub passes a unique connection id. You can retrieve this value in the Context. ConnectionId property of the hub context.
SignalR handles connection management automatically, and lets you broadcast messages to all connected clients simultaneously, like a chat room. You can also send messages to specific clients.
When a client invokes a function on the server side you can retrieve their connection ID via Context.ConnectionId
. Now, if you'd like to access that connection Id via a mechanism outside of a hub, you could:
public static ConcurrentDictionary<string, MyUserType>...
by adding to the dictionary in OnConnected
and removing from it in OnDisconnected
. Once you have your list of users you can then query it via your external mechanism.Ex 1:
public class MyHub : Hub { public void AHubMethod(string message) { MyExternalSingleton.InvokeAMethod(Context.ConnectionId); // Send the current clients connection id to your external service } }
Ex 2:
public class MyHub : Hub { public static ConcurrentDictionary<string, MyUserType> MyUsers = new ConcurrentDictionary<string, MyUserType>(); public override Task OnConnected() { MyUsers.TryAdd(Context.ConnectionId, new MyUserType() { ConnectionId = Context.ConnectionId }); return base.OnConnected(); } public override Task OnDisconnected(bool stopCalled) { MyUserType garbage; MyUsers.TryRemove(Context.ConnectionId, out garbage); return base.OnDisconnected(stopCalled); } public void PushData(){ //Values is copy-on-read but Clients.Clients expects IList, hence ToList() Clients.Clients(MyUsers.Keys.ToList()).ClientBoundEvent(data); } } public class MyUserType { public string ConnectionId { get; set; } // Can have whatever you want here } // Your external procedure then has access to all users via MyHub.MyUsers
Hope this helps!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With