[.NET][SignalR] 由 Server 调用 JavaScript–使用 SignalR 实践 Push 消息模式
在前一个范例中,我们己经实践出来一个简单的应用程序,而这次我们要来展示 SignalR 的另一个功能:由伺服端调用用户端的 JavaScript 命令码的功能,而这个功能的要求必须是要实践成 Hub 的模式,因此我们可以顺便看到如何实践 Hub 类型的 SignalR 应用程序。
在前一个范例中,我们己经实践出来一个简单的应用程序,而这次我们要来展示 SignalR 的另一个功能:由伺服端调用用户端的 JavaScript 命令码的功能,而这个功能的要求必须是要实践成 Hub 的模式,因此我们可以顺便看到如何实践 Hub 类型的 SignalR 应用程序。
一样的,我们在项目内加入一个新的类 PushNotification,并且设定继承 Hub 类 (这是 Hub 应用程序的要求) 以及实践 IConnected, IDisconnect 两个界面:
using System.Threading;
using System.Threading.Tasks;
using SignalR;
using SignalR.Hubs;
using SignalR.Infrastructure;
using SignalR.Hosting.AspNet;
namespace ServerPushMessageApplication
{
[HubName("push")]
public class PushNotification : Hub, IConnected, IDisconnect
{
// ...
}
}
接着,加入连线保留的对象以及实践 IConnected/IDisconnect 方法:
private static List _connectionIds = new List();
private static Task pushTask = null;
public Task Disconnect()
{
if (_connectionIds.Contains(this.Context.ConnectionId))
_connectionIds.Remove(this.Context.ConnectionId);
return null;
}
public Task Connect()
{
_connectionIds.Add(this.Context.ConnectionId);
return null;
}
public Task Reconnect(IEnumerable groups)
{
return null;
}
这段程序的用意是,在连线进到 Hub 时,将连线代码加到连线用户的集合中,等会就会使用到,因为我们会依照用户端的 ID 来调用用户端命令码。
接着,我们加入真正重要的程序,也就是 Push 用的程序:
public PushNotification()
{
pushTask = new Task(() =>
{
while (true)
{
if (_connectionIds.Count > 0)
{
foreach (string id in _connectionIds)
Clients[id].updateDateTime(DateTime.Now.ToString());
}
Thread.Sleep(10000);
}
});
pushTask.Start();
}
~PushNotification()
{
pushTask = null;
}
这段程序的用意是,会在每十秒钟时调用用户端的 updateDateTime() 命令码,并且将参数返回用户端,参数的排列与伺服端传入的顺序相同,等一下我们会实践到用户端的 JavaScript,届时就可以比较一下。
接着,我们在 Global.asax 的程序中,加入启用 Hub 的程序:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
// enable Hub
RouteTable.Routes.MapHubs();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
}
至此,服务器端就写好了,看起来不难吧。
接着,在项目中加入新的 View,然后加入下列的 HTML/JavaScript:
Index
用户端部分和 Persistent Connection 的不同,就是在用户端必须要加入 “/singler/hubs” 这个命令码来源,它会产生 hub 的 metadata,如果没有它的话,用户端针对 hub 的命令码 ($.connection.push) 会失效。
其中比较重要的是 push.updateDateTime 的实践,它就是要负责接收来自伺服端的数据并在用户端做处理的,但它必须要挂在 hub 对象之下,否则没办法被调用,这也是为什么 SignalR 能做伺服端调用用户端的原因。
完成后,执行结果如下:
可以参考用户端程序,可发现用户端只有启动连线而己,并没有主动调用服务器端,但服务器端却可以返回数据到用户端,这就是 SignalR 的神奇之处 (等以后我们讨论到细节时,你就不会觉得它神奇了 :) )。
Reference: https://github.com/SignalR/SignalR/wiki/QuickStart-Hubs
原文:大专栏 [.NET][SignalR] 由 Server 调用 JavaScript–使用 SignalR 实践 Push 消息模式
原文地址:https://www.cnblogs.com/petewell/p/11516494.html
- 黑产是如何强刷用户银行卡8.1万元的?
- Spring 必知概念(二)
- 利用iText 组件导出PDF
- 利用POI组件导出Excel的简单示例
- MongoDB 整合spring-data-jpa,spring 4.x
- 【微信开发】 红包接口开发
- 【微信开发】 使用单例设计模式 提供AccessToken 和Jsapi_ticket缓存支持
- @ResponseBody响应JSON 406
- tomcat不能运行或共存多个项目
- Spring Task 定时任务
- 如何为机器学习索引,切片,调整 NumPy 数组
- 逆向工程分析:摩托罗拉安全摄像头究竟有多不安全?
- 【maven学习】 利用Profile构建不同环境的部署包
- 如何写好一份渗透测试报告?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法