Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to obtain connection ID of signalR client on the server side?

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.

like image 826
Clint L Avatar asked Jan 03 '14 16:01

Clint L


People also ask

Is SignalR connection ID unique?

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.

What is SignalR connection?

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.


1 Answers

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:

  1. Just have the Hub invoke your external method passing in the connection id.
  2. Manage a list of connected clients aka like 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!

like image 142
N. Taylor Mullen Avatar answered Sep 22 '22 18:09

N. Taylor Mullen