I am using the sample Chat application from the SignalR Wiki Getting Started Hubs page. I have extended it to add Group support and it is working fine.
However, now I want to send a message to the group from an external Console application. Here is my code for the Console app and below that my code for Groups. How do I send a message to a Group from a proxy? Is it possible?
// Console App using System; using Microsoft.AspNet.SignalR.Client.Hubs; namespace SignalrNetClient { class Program { static void Main(string[] args) { // Connect to the service var connection = new HubConnection("http://localhost:50116"); var chatHub = connection.CreateHubProxy("Chat"); // Print the message when it comes in connection.Received += data => Console.WriteLine(data); // Start the connection connection.Start().Wait(); chatHub.Invoke("Send", "Hey there!"); string line = null; while ((line = Console.ReadLine()) != null) { // Send a message to the server connection.Send(line).Wait(); } } } }
SignalR Web App Host:
namespace SignalrServer.Hubs { public class Chat : Hub { public void Send(string message) { // Call the addMessage method on all clients Clients.All.addMessage(message); Clients.Group("RoomA").addMessage("Group Message " + message); } //server public void Join(string groupName) { Groups.Add(Context.ConnectionId, groupName); } } }
Default.aspx
<script src="http://code.jquery.com/jquery-1.8.2.min.js" type="text/javascript"></script> <script src="Scripts/jquery.signalR-1.0.1.min.js" type="text/javascript"></script> <!-- If this is an MVC project then use the following --> <!-- <script src="~/signalr/hubs" type="text/javascript"></script> --> <script src="signalr/hubs" type="text/javascript"></script> <script type="text/javascript"> $(function () { // Proxy created on the fly var chat = $.connection.chat; // Declare a function on the chat hub so the server can invoke it chat.client.addMessage = function (message) { $('#messages').append('<li>' + message + '</li>'); }; $.connection.hub.start(function () { chat.server.join("RoomA"); }); // Start the connection $.connection.hub.start().done(function () { $("#broadcast").click(function () { // Call the chat method on the server chat.server.send($('#msg').val()); }); }); }); </script> <div> <input type="text" id="msg" /> <input type="button" id="broadcast" value="broadcast" /> <ul id="messages"> </ul> </div>
What I have done with something similar is to create a method which accepts an object of your choice, e.g.
Your new class
public class MyMessage{ public string Msg { get; set; } public string Group { get; set; } }
Then create a method in the Hub that accepts this object.
public void Send(MyMessage message) { // Call the addMessage method on all clients Clients.All.addMessage(message.Msg); Clients.Group(message.Group).addMessage("Group Message " + message.Msg); }
Then from your client, you can then pass this object in.
chatHub.Invoke<MyMessage>("send", new MyMessage() { Msg = "Hello World", Group = "RoomA" });
You can then also call this from the JS client
chat.server.send({ Msg: "Hello World", Group: "RoomA" });
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