我有以下情况:
问题是,如何将webjob的进度传达给客户?最初我的想法是从webjob推送消息,因此Hub可以从队列中读取它。然后,我会通过集线器通知客户。但是,我无法找到传达webjob和集线器的方法,当消息被推入队列或服务总线时,我不知道如何在集线器中触发操作。也就是说,我不知道如何将集线器订阅到队列的某个消息。
有人可以帮我吗?
答案 0 :(得分:12)
我这样做的方法是将webjob设置为SignalR客户端,通过SignalR将消息从webjob推送到服务器,然后将这些消息转发给SignalR Web客户端。
首先在您的webjob上安装SignalR Web客户端(nuget包ID为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);
}
}