tutorial net hubs hubconnection example aspnet c# asp.net signalr

c# - hubs - Cliente SignalR.Net: ¿Cómo envío un mensaje a un grupo?



signalr tutorial (2)

En Winform .Net framework 4.0 el grupo ya no funciona.

Código del servidor:

[HubName("PublicHub")] public class PublicHub : HubBase { /// <summary> /// join group /// </summary> /// <param name="userLoginName"></param> /// <param name="hotelId"></param> /// <param name="groupCode"></param> [HubMethodName("JoinGroup")] public async Task JoinGroupAsync(string userLoginName, string hotelId, string groupCode) { await Groups.Add(Context.ConnectionId, ShopGroupKey(hotelId, groupCode)); Clients.Group(ShopGroupKey(hotelId, groupCode)).UpdateRoomStatus("UpdateRoomStatus", "UpdateRoomStatus"); } /// <summary> /// /// </summary> /// <param name="userLoginName"></param> /// <param name="hotelId"></param> /// <param name="groupCode"></param> [HubMethodName("QuitGroup")] public async Task QuitGroupAsync(string userLoginName, string hotelId, string groupCode) { await Groups.Remove(Context.ConnectionId, ShopGroupKey(hotelId, groupCode)); } }

y Código de Cliente:

IHubProxy interno PublicHub;

internal IHubProxy RoomHub; public static SignalRUtility Instance { get { if (_instance == null) { Host = ConfigurationManager.AppSettings["signalRHost"]; _instance = new SignalRUtility(); } return _instance; } } private SignalRUtility() { Connection = new HubConnection(Host + "/signalr", useDefaultUrl: false); PublicHub = Connection.CreateHubProxy("PublicHub"); RoomHub = Connection.CreateHubProxy("RoomStatusHub"); RoomHub.On<string>("UpdateRoomStatus", (code) => { if(RoomStatusDelegates != null) { RoomStatusDelegates(code); } }); RoomHub.On<string>("UpdateOrderStatus", (code) => { if (OrderStatusDelegates != null) { OrderStatusDelegates(code); } }); Connection.Start().Wait(); }

No recibe ningún mensaje del lado del servidor en el lado del cliente. Client.All puede enviar mensaje.

Estoy utilizando la aplicación de chat de muestra de la página de SignalR Wiki Getting Started Hubs. Lo extendí para agregar soporte de grupo y está funcionando bien.

Sin embargo, ahora quiero enviar un mensaje al grupo desde una aplicación de consola externa. Aquí está mi código para la aplicación de la Consola y debajo de mi código para Grupos. ¿Cómo envío un mensaje a un grupo desde un proxy? ¿Es posible?

// 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(); } } } }

Host de aplicación web de SignalR:

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>


Lo que he hecho con algo similar es crear un método que acepte un objeto de su elección, por ejemplo,

Tu nueva clase

public class MyMessage{ public string Msg { get; set; } public string Group { get; set; } }

Luego crea un método en el Hub que acepte este objeto.

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); }

Luego, desde tu cliente, puedes pasar este objeto.

chatHub.Invoke<MyMessage>("send", new MyMessage() { Msg = "Hello World", Group = "RoomA" });

También puede llamar a esto desde el cliente JS

chat.server.send({ Msg: "Hello World", Group: "RoomA" });