Asp.net mvc 5 WebJob与信号集线器之间的通信

Asp.net mvc 5 WebJob与信号集线器之间的通信,asp.net-mvc-5,signalr,azure-webjobs,azure-servicebus-queues,azure-webjobssdk,Asp.net Mvc 5,Signalr,Azure Webjobs,Azure Servicebus Queues,Azure Webjobssdk,我有以下情况: 我有一个azure webjob(用于发送邮件),我需要在我的web应用程序中检查webjob的进度 我正在使用信号器与服务器上的客户端通信 当我想发送电子邮件时,我会在队列中推送一条消息,azure webjob会完成他的工作 问题是,如何向客户传达webjob的进度?最初我的想法是从webjob推送消息,以便集线器可以从队列中读取消息。然后,我会从中心通知客户。但是,我无法找到一种方式来通信webjob和集线器,我不知道当消息被推送到队列或服务总线中时如何在集线器中触发操

我有以下情况:

  • 我有一个azure webjob(用于发送邮件),我需要在我的web应用程序中检查webjob的进度
  • 我正在使用信号器与服务器上的客户端通信
  • 当我想发送电子邮件时,我会在队列中推送一条消息,azure webjob会完成他的工作
问题是,如何向客户传达webjob的进度?最初我的想法是从webjob推送消息,以便集线器可以从队列中读取消息。然后,我会从中心通知客户。但是,我无法找到一种方式来通信webjob和集线器,我不知道当消息被推送到队列或服务总线中时如何在集线器中触发操作。也就是说,我不知道如何向集线器订阅队列中的某个消息


有人能帮我吗?

我的方法是将webjob设置为SignalR客户端,通过SignalR将消息从webjob推送到服务器,然后将这些消息转发给SignalR web客户端

首先在您的webjob上安装SignalR web客户端(nuget包ID为Microsoft.AspNet.SignalR.client)

然后在webjob中,初始化信号器连接集线器并向服务器发送消息,例如:

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");
    }
}
您的信号器服务器将接收这些消息,然后可以将它们转发给其他信号器客户端,例如:

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

还请注意,
HubConnection
允许您添加额外的头,例如授权头,这意味着您还可以保护webjob和通知中心之间的通信。顺便说一下,_proxy.Invoke()必须具有与调用的方法完全相同的属性数,无论它们是否可选。我的错误(未命中方法并引发异常)是由于忽略可选参数引起的。那是3年前的事了。也许现在有更好的解决方案?@teppic,如果我们在Traffic Manager后面有多个信号服务器?Ie.“决定不让交通管理人员忙,但不让那些有客户要联系的人忙。”。那么这将无法向这些用户发送“电子邮件进度”。您成功完成此任务了吗?