web-dev-qa-db-fra.com

Client SignalR .Net: Comment envoyer un message à un groupe?

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>
20
robrtc

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" });
29
Tim B James

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.

0
Tony