9

次のシナリオがあります。

  • Azure Web ジョブ (メールの送信に使用) があり、Web アプリケーションで Web ジョブの進行状況を確認する必要があります。
  • サーバーからクライアントと通信するために SignalR を使用しています。
  • メールを送信したいときは、キューにメッセージをプッシュすると、azure Web ジョブがその仕事をしてくれます。

問題は、Web ジョブの進行状況をクライアントに伝えるにはどうすればよいかということです。もともと私の考えは、ハブがキューからメッセージを読み取ることができるように、Web ジョブからメッセージをプッシュすることでした。次に、ハブからクライアントに通知します。ただし、Web ジョブとハブを通信する方法を見つけることができません。メッセージがキューまたはサービス バスにプッシュされたときに、ハブでアクションをトリガーする方法がわかりません。つまり、ハブをキューの特定のメッセージにサブスクライブする方法がわかりません。

誰かがそれを手伝ってくれますか?

4

1 に答える 1

14

私が行った方法は、Web ジョブを SignalR クライアントとしてセットアップし、SignalR を介して Web ジョブからサーバーにメッセージをプッシュし、それらのメッセージを SignalR Web クライアントにリレーすることです。

Web ジョブに SignalR Web クライアント (nuget パッケージ ID は Microsoft.AspNet.SignalR.Client) をインストールすることから始めます。

次に、Web ジョブで、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);
    }        
}
于 2015-09-01T02:30:10.697 に答える