Интегрировать с помощью SignalR веб-API для push-уведомлений для клиентов


Я разрабатываю приложение, серверная технология-это asp.net веб-api, клиентская часть-javascript. В моем приложении я использую Signalr для уведомления клиентов об обновлениях-push-уведомления от сервера к клиентам.

Все взаимодействие signalr происходит вне класса Hub, из-за толчков, поступающих от HTTP-запросов, а не от клиентского толчка к серверу через signalr.

После обработки успешного HTTP-запроса я хочу, чтобы все клиенты, кроме того, кто отправил запрос на уведомление.

Кто должен отвечать за эти уведомления? После обработки юридического запроса, должен ли мой сервер просто отправить уведомление клиентам? (Это то, что я делаю в данный момент) если это путь, как я могу уведомить всех клиентов, кроме того, кто сделал запрос? Напоминание-поскольку запрос был Http, а не signalr push, толчки на стороне клиента происходят в классе вне концентратора. Поэтому я не могу использовать контекст или Клиент.Другие собственности, как вы, вероятно, предположили бы. Как я могу знать, какие клиенты должны быть уведомлены? Сейчас я просто пользуюсь клиентами.Все и тот, кто сделал запрос, также уведомлены, что мне не нравится.

Вариант 2 заключается в том, что после моих ответов сервера с кодом состояния успеха. Клиент, который сделал запрос, будет нести ответственность за уведомление других клиентов - это означает, что он будет отправлять сообщение на сервер, а сервер будет отправлять это уведомление всем другим клиентам. клиенты (на этот раз это будет в центре signalr, так что я мог бы использовать клиентов.Другие).

Какой подход я должен принять?

1 5

1 ответ:

Я думаю, что ваш первый подход является бесшовным и будет довольно легко реализовать. Кроме того, вы не хотите, чтобы пользователи отвечали за уведомления. Пользователи ленивы.

Таким образом, в основном после того, как вы "обработали" свой запрос и не поймали никаких исключений, вы получите контекст концентратора SignalR и используете встроенный SignalR C# API для передачи сообщения всем клиентам , кроме отправителя.

Вот код, который войдет в ваш Controller:

    [Route("ProcessMessage")]
    public async void ProcessMessage(string[] clientConnectionStrings)
    {
        // do some processing
        var hub = GlobalHost.ConnectionManager.GetHubContext<MessagingHub>();

        hub.Clients.AllExcept(clientConnectionStrings);
    }

Тебе придется сдать экзамен. в ID подключения клиента использовать AllExcept, но это должно быть довольно простой интеграцией. (Примечание: если бы вы взаимодействовали непосредственно с вашим концентратором SignalR, вам не пришлось бы этого делать)

Примечание: чтобы исключить клиентское соединение из вашей трансляции, вы можете получить к нему доступ следующим образом:

$.connection.hub.id

Другой подход к этому может заключаться в непосредственном использовании концентратора SignalR, но для запуска событий на хаб-сервере потребуется дополнительный код JavaScript. Для пример:
    $.ajax({
        url: 'Some/Url/',
        type: 'POST',
        success: function (data) { 
                connection.server.someDataChangeEvent(); 
        },
        error: function (ex) { return; }
    });

Код Узла SignalR:

public void SomeDataChangeEvent(string connId)
{
    Clients.Others.updateData(_someDataStore.getUpdates().ToList());
}

Код Клиента:

connection.client.updateData = function() {
    //do stuff
}