7

У меня есть следующий сценарий:Связь между WebJob и SignalR Hub

  • У меня есть лазурь webjob (используется для отправки почты), и мне нужно, чтобы проверить ход webjob в моем веб-приложение.
  • Я использую SignalR для связи с клиентами с моего сервера.
  • Когда я хочу отправить электронное письмо, я нажимаю сообщение в очереди, и лазурный webjob выполняет свою работу.

Вопрос в том, как я могу сообщить о ходе работы webjob клиенту? Первоначально моя идея состояла в том, чтобы вытащить сообщение из webjob, поэтому концентратор мог прочитать его из очереди. Затем я буду уведомлять клиентов из центра. Тем не менее, я не могу найти способ сообщить веб-сайт и концентратор, я не знаю, как вызвать действие в концентраторе, когда сообщение помещается в очередь или в служебную шину. То есть я не знаю, как подписаться на концентратор на определенное сообщение очереди.

Может ли кто-нибудь помочь мне с этим?

ответ

9

Способ, которым я это сделал, заключается в том, чтобы создать веб-сайт в качестве клиента SignalR, направить сообщения через SignalR с веб-сайта на сервер, а затем передать эти сообщения веб-клиентам SignalR.

Начните с установки веб-клиента SignalR (идентификатор пакета nuget - Microsoft.AspNet.SignalR.Client) на веб-сайте.

Затем в webjob инициализацию концентратора соединений SignalR и отправлять сообщения на сервер, например:

public class Functions 
{ 
    HubConnection _hub = new HubConnection("http://your.signalr.server"); 
    var _proxy = hub.CreateHubProxy("EmailHub"); 

    public async Task ProcessQueueMessageAsync([QueueTrigger("queue")] EmailDto message) 
    { 
     if (_hub.State == ConnectionState.Disconnected) 
     { 
      await _hub.Start(); 
     } 

     ... 

     await _proxy.Invoke("SendEmailProgress", message.Id, "complete"); 
    } 
} 

Ваш SignalR сервер будет получать эти сообщения, а затем может передавать их другим клиентам SignalR, например:

public class EmailHub : Hub 
{ 
    public void SendEmailProgress(int messageId, string status) 
    {    
     Clients.All.broadcastEmailStatus(messageId, status); 
    }   
} 
+2

отметить также, что 'HubConnection' позволяет добавлять дополнительные заголовки, такие как ** авторизации ** заголовки, а это означает, что вы можете также обеспечить связь между webjob и концентратором уведомления. –

+0

Кстати, _proxy.Invoke() должен иметь то же самое количество атрибутов, которые вызывается вызываемым методом, независимо от того, являются ли они необязательными или нет. Моя ошибка (не ударяя метод и исключение бросания) была вызвана ommiting необязательными параметрами. – podvlada

Смежные вопросы