Отправить сообщение сервера подключенным клиентам с помощью Signalr / PersistentConnection

Я использую SignalR / PersistentConnection, а не концентратор.

Я хочу отправить сообщение с сервера клиенту. У меня есть идентификатор клиента для его отправки, но как я могу отправить сообщение с сервера клиенту?

Например, когда на сервере происходит какое-то событие, мы хотим отправить уведомление определенному пользователю.

Любые идеи?


person Campagnolo    schedule 30.09.2011    source источник


Ответы (3)


На странице github показано, как это сделать с помощью PersistentConnections.

public class MyConnection : PersistentConnection {
    protected override Task OnReceivedAsync(string clientId, string data) {
        // Broadcast data to all clients
        return Connection.Broadcast(data);
    }
}

Global.asax

using System;
using System.Web.Routing;
using SignalR.Routing;

public class Global : System.Web.HttpApplication {
    protected void Application_Start(object sender, EventArgs e) {
        // Register the route for chat
        RouteTable.Routes.MapConnection<MyConnection>("echo", "echo/{*operation}");
    }
}

Затем на клиенте:

$(function () {
    var connection = $.connection('echo');

    connection.received(function (data) {
        $('#messages').append('<li>' + data + '</li>');
    });

    connection.start();

    $("#broadcast").click(function () {
        connection.send($('#msg').val());
    });
});
person davidfowl    schedule 01.10.2011
comment
Это соответствующая вики-страница github.com/SignalR/SignalR/wiki/ - person bnieland; 14.01.2012
comment
Предполагается, что есть входящее сообщение, на которое нужно ответить. Как отправить сообщение всем подключенным клиентам, скажем, по таймеру? - person Ian Mercer; 07.03.2012
comment
stackoverflow.com/ questions / 9472162 /, кажется, отвечает на этот вопрос, не так ли? - person Ian Mercer; 07.03.2012
comment
Запустите поток таймера в запуске приложения в глобальном asax и отправьте данные таким образом. - person davidfowl; 07.03.2012
comment
Будет ли этот подход работать и для концентратора, или это должно быть PersistentConnection? - person AlignedDev; 03.04.2012
comment
Неважно, сейчас я вижу это в DemoHub.cs и Global.asax Application_Start примеров. - person AlignedDev; 03.04.2012

Может быть функция AddToGroup в справке на стороне сервера

Разводите клиентов по разным каналам

public bool Join(string channel)
{
    AddToGroup(channel.ToString()).Wait();
    return true;
}

Затем они могут отправить сообщение в другом канале

public void Send(string channel, string message)
{

    String id = this.Context.ClientId;

    Clients[channel.ToString()].addMessage(message);

}
person Anthony    schedule 18.10.2011

using SignalR;
using SignalR.Hosting.AspNet;
using SignalR.Infrastructure;

public class MyConnection : PersistentConnection
{
}

public class Notifier
{
  public void Notify(string clientId, object data) {
    MyConnection connection = (MyConnection) AspNetHost.DependencyResolver
      .Resolve<IConnectionManager()
      .GetConnection<MyConnection>();

    connection.Send(clientId, data);
  }
}

https://github.com/SignalR/SignalR/wiki/PersistentConnection

person resnyanskiy    schedule 10.04.2012