9

我有以下情况:

  • 我有一个 azure webjob(用于发送邮件),我需要在我的 web 应用程序中检查 webjob 的进度。
  • 我正在使用 SignalR 从我的服务器与客户端进行通信。
  • 当我想发送电子邮件时,我会在队列中推送一条消息,然后 azure webjob 会完成他的工作。

问题是,如何将 webjob 的进度传达给客户端?最初我的想法是从 webjob 推送消息,以便 Hub 可以从队列中读取它。然后,我会从中心通知客户。但是,我无法找到一种方法来通信 webjob 和集线器,当消息被推送到队列或服务总线中时,我不知道如何在集线器中触发操作。也就是说,我不知道如何为 hub 订阅队列的某个消息。

有人可以帮我吗?

4

1 回答 1

14

我这样做的方法是将 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);
    }        
}
于 2015-09-01T02:30:10.697 回答