c# - 辅助角色和 Web 角色之间的 Azure 通信

标签 c# azure azure-web-roles azure-worker-roles

您好,我正在构建一项云服务,它(目前)有一个网络和一个辅助角色。我想要的工作流程是:浏览器调用 Web 角色上的 webApi Controller ,该 Controller 将消息发送到队列(或服务总线),然后由辅助角色处理。到目前为止,一切都很好。现在,当辅助角色完成消息处理时,我想调用 Web 角色上的一个方法,该方法将向浏览器发出处理已完成的信号(通过 SignalR)。如果这不是一个正确的提问地点,请原谅,因为这更像是一个“最佳实践”问题,而不是一个真正的问题。到目前为止我考虑过两种方法:

  1. 辅助角色用任务的进度和完成情况更新表行(在表存储中)。没有向 Web 角色发送信号。浏览器直接读取轮询表存储(通过 REST API),因此知道任务何时完成。尽管我不喜欢持续轮询的方法并且我希望有一个“基于事件”的解决方案,但这种方法效果很好(我已经测试过)。此外,一旦客户端获得进程已完成的信息,它必须对 Web API 方法执行额外的调用,以向其他客户端广播(通过 SignalR)操作已完成。

  2. 使用Interrole communication与 SignalR 一起使用(参见下面的代码示例)也可以工作(也已经测试过)

代码示例:

var protocol = "http";      
var ipAddress = RoleEnvironment.Roles["XXX.YYY.Web"]
        .Instances[0]
        .InstanceEndpoints.ToArray()
        .Where(ep => ep.Value.Protocol == protocol)
        .First()
        .Value.IPEndpoint.ToString();

var stringEndpoint = string.Format("{0}://{1}", protocol, ipAddress.ToString());                
Trace.WriteLine("Retrieved endpoint address: " + stringEndpoint, "Information");            
HubConnection connection = new HubConnection(stringEndpoint);
IHubProxy proxy = connection.CreateHubProxy("MyWebHub");
connection.Start().Wait();

//later...

proxy.Invoke("ProgressUpdated", clientId, progress);

我的问题是:是否有其他(更好)的方式在 Worker 角色 -> Web 角色方向上进行通信?也就是说,当辅助角色完成其处理时,触发Web角色上的方法?然后,Web 角色上的方法将通过 SignalR 将更新广播给所有客户端。我还看了Event Hubs但据我了解,事件消费者仍将以辅助角色运行。

最佳答案

好吧,经过一些额外的尝试和一些研究,我想出了一个可能的解决方案......我正在使用这段代码

AzureServiceBus.QueueClient.OnMessage((message) =>
            {
                try
                {
                    // Process message from queue
                    Trace.WriteLine("Message received: " + ((BrokeredMessage)message).Label);

                    var breezeController = new BreezeController();
                    breezeController.TestSignal();

                    // Remove message from queue
                    message.Complete();
                }
                catch (Exception)
                {
                    // Indicates a problem, unlock message in queue
                    message.Abandon();
                }
            });

在 Web 角色(不是 Worker 角色)的 OnStart 方法中,以便我可以在 Web 角色中引用我的方法(在本例中为 TestSignal()),但事实证明,从内部调用时 IHubContext 始终为 null这个 OnMessage 事件处理程序,因为它(很可能)属于不同的 AppDomain,因此甚至 signalR 的静态集线器也没有共享。因此,我已将相同的整个代码移至 Global.asax.cs 内,以便它将共享相同的 AppDomain,现在它可以工作了。我想我会继续使用这种方法,因为我比连续轮询更喜欢它。

关于c# - 辅助角色和 Web 角色之间的 Azure 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29915315/

相关文章:

azure - SAS token - Azure IoTHub

python - 使用 python 创建 csv 文件并将其上传到 azure blob 存储

iis - 创建网站后运行的 Azure 启动任务

c# - 清除排序描述后如何删除 wpf 网格排序箭头

c# - 使用 .net 4 项目和 4.5 目标?

azure - Core 2.2 上的 SignalR 部署到 Azure 时失败

c# - 调试从 csrun.exe 开始的 Azure Web 角色

c# - Enumerable.Last<T>() 和 C# 数组

c# - 如何判断在使用 System.CommandLine 时是否指定了一个选项?

Azure 帐户因信用额度而暂停意味着云服务实例部署会自动删除 - 缓解措施?