7

Ho il seguente scenario:comunicazione tra un WebJob e SignalR Hub

  • Ho un webjob azzurro (utilizzato per inviare mail) e ho bisogno di controllare l'avanzamento del webjob nella mia applicazione web.
  • Sto utilizzando SignalR per comunicare con i client dal mio server.
  • Quando voglio inviare un messaggio, spingo un messaggio in coda e il webjob azzurro fa il suo lavoro.

La domanda è: come posso comunicare lo stato di avanzamento del lavoro al client? Originariamente la mia idea era di inviare un messaggio dal webjob, così l'Hub poteva leggerlo dalla coda. Quindi, informerei i clienti dall'hub. Tuttavia, non sono in grado di trovare un modo per comunicare il webjob e l'hub, non so come attivare un'azione nell'hub quando un messaggio viene inserito nella coda o nel bus di servizio. Vale a dire, non so come iscrivere l'hub a un certo messaggio della coda.

Qualcuno può aiutarmi?

risposta

9

Il modo in cui l'ho fatto è impostare il webjob come client SignalR, inviare messaggi via SignalR dal webjob al server, quindi inoltrare tali messaggi ai client Web SignalR.

Iniziare installando il client Web SignalR (ID pacchetto nuget è Microsoft.AspNet.SignalR.Client) sul proprio webjob.

Poi, nel tuo webjob, inizializzare l'hub di connessione SignalR e inviare messaggi al server, ad esempio:

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"); 
    } 
} 

Il server SignalR riceverà questi messaggi e possono poi trasmettere agli altri clienti SignalR, ad esempio:

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

si noti inoltre che il 'HubConnection' consente di aggiungere intestazioni aggiuntive, come ad esempio ** ** di autorizzazione intestazioni, il che significa che si può anche fissare la comunicazione tra il webjob e Hub notifica. –

+0

A proposito, _proxy.Invoke() deve avere esattamente lo stesso numero di attributi del metodo invocato, indipendentemente dal fatto che siano facoltativi o meno. Il mio errore (non colpire il metodo e lanciare un'eccezione) è stato causato dall'omitare i parametri opzionali. – podvlada

Problemi correlati