我正在运行一个ASP.net MVC云服务项目,该项目运行两个角色,一个Web角色和一个辅助角色。 Web角色中的一个页面发起构建APK文件的请求,在服务器上构建APK文件可能需要1-5分钟。所以我们想出了以下流程:
我们的问题现在在SignalR部分,我们如何在页面上通知用户APK已准备好并可以下载。
答案 0 :(得分:1)
编辑 - 为了完整起见,复制第一条评论的内容 -
我建议通过以下链接
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时,您可以使用以下代码(将其置于任何位置 - 例如,在控制器操作中)以实际将消息推送到相关客户端 -
var apkHub = GlobalHost.ConnectionManager.GetHubContext<APKHub>();
apkHub.Clients.Group(groupName).notifyUser(groupName);
groupName可以是唯一标识用户的标识符。
希望这有帮助。