我正在运行一个 ASP.net MVC 云服务项目,该项目运行两个角色,一个 Web 角色和一个辅助角色。 Web 角色中的一个页面发起构建 APK 文件的请求,在服务器上构建 APK 文件可能需要 1-5 分钟。所以我们想出了以下流程:
(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 集线器可能看起来像这样 -
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/