我正在运行一个 ASP.net MVC 云服务项目,该项目运行两个角色,一个 Web 角色和一个辅助角色。 Web 角色中的一个页面发起构建 APK 文件的请求,在服务器上构建 APK 文件可能需要 1-5 分钟。所以我们想出了以下流程:

  • 用户在页面上发起APK构建过程。
  • 请求被路由到我们的 mvc 操作,在 Azure 存储队列上创建一条新消息。
  • Worker 角色始终从队列中轮询并启动 APK 构建过程。现在 APK 已准备就绪,我们希望通过以下方式通知用户:
    (a) 发送电子邮件,现在正在工作。 (b) 使用 SignalR 在页面上通知用户。

  • 我们现在的问题是在 SignalR 部分,我们如何在页面上通知用户 APK 已准备好并且他可以下载它。

    最佳答案

    编辑 - 为完整起见复制第一条评论的内容 -

    我再次查看了这个问题,我知道您正在使用辅助角色来轮询队列。在这种情况下,您可以使您的工作角色成为连接到 Web 角色上的 APK signalR 中心的 .Net SignalR 客户端。 web 角色上的 signlaR 集线器可以简单地将它从 .Net 客户端接收到的任何消息转发到 javascript 客户端(浏览器)。

    我建议通过以下链接

    Hubs API Guide - Server
    Hubs API Guide - Javascript Client

    在完成其余的答案之前。

    从上面两个链接可以理解,SignalR 使服务器能够将数据“推送”到客户端。为了实现这一点,你需要做两件事——

  • 一个 signalR 集线器 - 这是客户端可以订阅以接收消息的“集线器”。
  • 连接到集线器的客户端

  • 服务器上的 signalR 集线器可能看起来像这样 -
        public class APKHub : Hub
        {
            public async Task JoinGroup(string groupName)
            {
                await Groups.Add(Context.ConnectionId, groupName);
                Clients.Group(groupName).sendMessage(Context.User.Identity.Name + " joined.");
            }
    
            public Task LeaveGroup(string groupName)
            {
                return Groups.Remove(Context.ConnectionId, groupName);
            }
    
            public void NotifyUser(string userId)
            {
                this.Clients.Group(userId).notify();
            }
        }
    

    在客户端,您的代码可能如下所示 -
    var notificationHandler = function () {
    
    var url;
    var user;
    
    var init = function (notificationUrl, userId) {
    
        url = notificationUrl;
        user = userId;
    
        connectToAPKHub();
    }
    
    var connectToAPKHub = function () {
        $.connection.hub.url = url;
        var apk= $.connection.apkHub;
    
        apk.client.notifyUser = function (user) {
            console.log(user);
        }
    
        apk.client.addMessage = function (message) {
            console.log(message);
        }
    
        $.connection.hub.start().done(function () {
            console.log('connected to apkhub');
            apk.server.joinGroup(user);
        })
    }
    
    
    return {
        init: init
    }
    }();
    

    NotificationUrl 是 signalR 服务器正在监听的 URL。

    这在服务器上设置了您的基本集线器,您现在应该能够将您的客户端连接到 signalR 集线器。构建 APK 后,您可以使用以下代码(将其放置在任何地方 - 例如 - 在 Controller 操作中)实际向相关客户端推送消息 -
    var apkHub = GlobalHost.ConnectionManager.GetHubContext<APKHub>();
    apkHub.Clients.Group(groupName).notifyUser(groupName);
    

    groupName 可以是唯一标识用户的标识符。

    希望这可以帮助。

    关于asp.net - 使用 SignalR 从 Azure 辅助角色向客户端发送消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28022125/

    10-12 12:37
    查看更多