Asp.net-Mvc-5

WebJob 和 SignalR Hub 之間的通信

  • September 1, 2015

我有以下情況:

  • 我有一個 azure webjob(用於發送郵件),我需要在我的 web 應用程序中檢查 webjob 的進度。
  • 我正在使用 SignalR 從我的伺服器與客戶端進行通信。
  • 當我想發送電子郵件時,我會在隊列中推送一條消息,然後 azure webjob 會完成他的工作。

問題是,如何將 webjob 的進度傳達給客戶端?最初我的想法是從 webjob 推送消息,以便 Hub 可以從隊列中讀取它。然後,我會從中心通知客戶。但是,我無法找到一種方法來通信 webjob 和集線器,當消息被推送到隊列或服務匯流排中時,我不知道如何在集線器中觸發操作。也就是說,我不知道如何訂閱集線器到隊列的某個消息。

有人可以幫我嗎?

我所做的方法是將 webjob 設置為 SignalR 客戶端,通過 SignalR 從 webjob 將消息推送到伺服器,然後將這些消息中繼到 SignalR web 客戶端。

首先在您的網路作業上安裝 SignalR Web 客戶端(nuget 包 ID 為 Microsoft.AspNet.SignalR.Client)。

然後在您的網路作業中,初始化您的 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);
   }        
}

引用自:https://stackoverflow.com/questions/27407286