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