как я могу отправить сообщение с signalr клиенту?

Я хочу использовать signalR для своего веб-сайта браузера clint, чтобы он мог получать сообщения с сервера при добавлении нового заказа. Поэтому я хочу, чтобы он реагировал на событие на стороне сервера, которое не запускается ни одним браузером.

На сайте несколько пользователей. Пользователь должен быть уведомлен, когда на сервере размещается новый заказ для него. Как я уведомляю только определенного пользователя и делаю это из метода, добавляющего пользователя?

Есть ли код типа:

var chat=new Chat();
chat.Send("hihi");

помещается в метод AddOrder с

public class Chat : Hub
{
    public void Send(string message)
    {
        // Call the addMessage method on all clients     
        Clients.refresh(message);
    }
}

person Ryan    schedule 27.05.2012    source источник


Ответы (3)


Вы можете переопределить идентификатор клиента по умолчанию (используемый для идентификации окна браузера пользователя) и заменить его своим собственным. Ваш идентификатор клиента будет получен от вашего поставщика членства.

Создайте новый класс и реализуйте IConnectionIdGenerator.

public class UserIdClientIdFactory : IConnectionIdGenerator
{
    public string GenerateConnectionId(IRequest request)
    {
        return Guid.NewGuid().ToString();
    }
}

Приведенный выше метод просто создает новый Guid, но вы должны вернуть идентификатор клиента от вашего поставщика членства.

Затем вам нужно зарегистрировать этот новый класс с помощью SignalR dependencyresolver, поэтому в методе Application_Start в файле global.asax добавьте следующую строку

GlobalHost.DependencyResolver.Register(typeof(IConnectionIdGenerator), () => new UserIdClientIdFactory());

Когда размещается новый заказ, вы получаете конкретного клиента и передаете ему сообщение, например:

    //clientId matches the user id from you membership provider.

    var clients = GlobalHost.ConnectionManager.GetHubContext().Clients;
    clients[clientId].yourClientSideCallBackMethodGoesHere(someValue);
person WooHoo    schedule 28.05.2012
comment
Это решение устарело. См. приведенный ниже вопрос для получения более подробной информации об этом. не найдено в выпуске signalr 1 0rc2"> stackoverflow.com/questions/14725051/ - person JBeagle; 19.03.2013

Вы должны сохранить Context.ConnectionId для всех подключенных пользователей, связать это с пользователями вашего веб-сайта, а затем использовать Clients[connectionId].addMessage(data);

person Jonas Lincoln    schedule 28.05.2012

Один из способов сделать это — создать коллекцию пользователей (пользователей веб-сайта), каждый из которых связан с идентификатором соединения. Затем вы можете использовать события SignalR OnConnected/OnDisconnected, чтобы добавлять и удалять пользователей из этого списка.

E.g.

public override Task OnConnected()
{
     // Add users here with Context.ConnectionId
}

public override Task OnDisconnected()
{
     // Remove users from collection here by identifying them with Context.ConnectionId
}
person JBeagle    schedule 19.03.2013