WebJob 和 SignalR Hub 之间的通信

Posted

技术标签:

【中文标题】WebJob 和 SignalR Hub 之间的通信【英文标题】:Communication between a WebJob and SignalR Hub 【发布时间】:2015-02-09 00:26:06 【问题描述】:

我有以下场景:

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

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

有人可以帮我吗?

【问题讨论】:

你成功完成了这项任务吗? 【参考方案1】:

我这样做的方式是将 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);
            

【讨论】:

另请注意,HubConnection 允许您添加额外的标头,例如 Authorization 标头,这意味着您还可以保护网络作业和通知中心之间的通信。 顺便说一下 _proxy.Invoke() 必须具有与被调用方法完全相同数量的属性,无论它们是否是可选的。我的错误(未命中方法并引发异常)是由省略可选参数引起的。 那是 3 年前的事了。或许现在有更好的解决方案? @teppic 如果我们在流量管理器后面有多个信号服务器? IE。 “your.signalr.server”解析为流量管理器不忙,而不是那些有客户要联系的人。那么这将无法向这些人发送“电子邮件进度”。

以上是关于WebJob 和 SignalR Hub 之间的通信的主要内容,如果未能解决你的问题,请参考以下文章

SignalR + 通过操作方法向 Hub 发布消息

如何在 SignalR 客户端中使用 async/await 和 hub.On

Signalr 将 IHubContext 转换为实际的 Hub

.net core 3.0 Signalr - 02 使用强类型的Hub

SignalR - 从服务器端代码调用 Hub 类方法(存在于单独的 MVC 项目中)

.net core 3.0 Signalr - 02 使用强类型的Hub