J'utilise l'exemple d'application de conversation sur la page Hubs de mise en route de SignalR Wiki. Je l'ai étendu pour ajouter le support du groupe et cela fonctionne bien.
Cependant, maintenant je veux envoyer un message au groupe à partir d'une application console externe. Voici mon code pour l'application Console et ci-dessous mon code pour les groupes. Comment envoyer un message à un groupe à partir d'un proxy? C'est 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();
}
}
}
}
Hôte de l'application Web 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>
Ce que j'ai fait avec quelque chose de similaire, c'est de créer une méthode qui accepte un objet de votre choix, par ex.
Votre nouvelle classe
public class MyMessage{
public string Msg { get; set; }
public string Group { get; set; }
}
Créez ensuite une méthode dans le Hub qui accepte cet objet.
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);
}
Ensuite, à partir de votre client, vous pouvez ensuite passer cet objet.
chatHub.Invoke<MyMessage>("send", new MyMessage() { Msg = "Hello World", Group = "RoomA" });
Vous pouvez également l'appeler à partir du client JS
chat.server.send({ Msg: "Hello World", Group: "RoomA" });
Dans Winform .Net framework 4.0
le groupe ne fonctionne plus.
Code serveur:
[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));
}
}
Code client:
internal IHubProxy 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();
}
Ne reçoit aucun message du côté serveur côté client. Client.All
peut envoyer un message.