[.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

时间: 2024-11-07 16:14:37

[.NET][SignalR] 由 Server 调用 JavaScript–使用 SignalR 实践 Push 消息模式的相关文章

Server Side JavaScript Code Injection Attack服务端js注入攻击

今天扫描器误报了这个漏洞,我觉着是误报了. 趁机了解一下, 好像是针对nosql与nodejs的服务端, 我觉着可能是js对于nodejs就是可执行的代码, 也就是任意代码执行, 这么一个攻击. stackoverflow上有一个http://stackoverflow.com/questions/27879131/server-side-javascript-code-injection-attack 巧了,看来我和他用了同款扫描工具,有了同样的问题. 看回答,大意竟是赞同他aspx可能有这个

ASP.NET调用javascript脚本的方法总结

ASP.NET本身就提供了多种调用javascript脚本的方法,本文总结了六种调用方法,大家根据自己的使用习惯可以选择相应的调用方式了! 1.直接在前台调用 javascript 函数 很简单,在 head 元素之间加入 script 元素,将 type 元素设置为 " text/javascript " 如: <head runat="server"> <script type="text/javascript" >

C#实现百度地图附近搜索&amp;调用JavaScript函数

前一篇文章"C#调用百度地图API入门&解决BMap未定义问题"讲述了如何通过C#调用百度API显示地图,并且如何解决BMap未定义的问题.这篇文章主要更加详细的介绍百度地图的一些功能,包括附近搜索.城市搜索.路线规划.添加覆盖物等等. 希望文章对你有所帮助!如果文章中有不足之处,还请海涵~ 百度官方文档:http://developer.baidu.com/map/jsmobile.htm 官方DEMO例:http://developer.baidu.com/map/jsde

selenium之调用Javascript

selenium调用Javascript使用方法: driver.execute_script(js) 使用JS获取元素文本值,代码片段如下: ...... js = "return $('#searchKey').val()" val = driver.execute_script(js) # 调用JavaScript获取输入框的值 print('删除失败!数据为:' + val) # 输出元素文本值 ......

在 Flash ActionScript 2.0 中调用 Javascript 方法

本篇文章由:http://xinpure.com/call-the-javascript-method-in-flash-actionscript-2-0/ 在 Flash ActionScript 2.0 中调用 Javascript 方法 最近在工作中,有个这样的需求: 要从 Flash ActionScript 2.0 中调用网页上的 Javascript 方法 这是一个关于 Flash 和 Javascript 交互的问题. 在 ActionScript 2.0 中调用外部 javasc

lzugis——Arcgis Server for JavaScript API之自定义InfoWindow(续)

同样的标题后面加了一个括弧,不是为了增减博文数量,而确实是上个功能的完善,标注为续,意思是继续上次的内容,来说说如何自定义InfoWindow. 在上一讲中,实现了InfoWindow的显示,但是并没有实现地图拖动地图InfoWindow随着联动,以及缩放地图InfoWindow随着联动的问题,在本文章中,就上述两个问题提供一个解决思路. 首先,说说拖动地图InfoWindow的联动.拖动地图时,地图并未做缩放,所以只是做一个位置的偏移,因此,定义一个公共变量,记录InfoWindow出来时候的

Sql Server 调用DLL

原文:Sql Server 调用DLL 背景 在处理数据或者分析数据时,我们常常需要加入一定的逻辑,该些处理逻辑有些sql是可以支持,有些逻辑SQL则无能为力,在这种情况下,大多数人都会编写相关的程序来处理成自己想要的数据,但每次处理相同逻辑时,都需要运行一次程序非常麻烦. 案例 IE地址栏上的地址在记入日志表中时,其数据是通过编码的,如果我们想要看到明文,则需要相应的解码,可以用SQL语句来实现,如: 摘自:http://blog.csdn.net/ruijc/article/details/

java调用javascript :js引擎rhino

java调用javascript :js引擎rhino JavaJavaScriptEclipse脚本SQL 前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式.结果方案五花八门:1.jakarta commons JEXL. 2.Beanshell3.Java Math Expression Parser jep 4.parse combinator jparsec 5.jdk 6.0的 script6.利用SQL 7.自己写语法分析如果自己写语法分析,没有个200

在&lt;a&gt;&lt;/a&gt;标签中调用javascript脚本

有时候,我们点击了<a></a>标签(除了跳转到指定链接外)想要它调用某个方法,及调用javascript脚本,该如何做: 方法1:<a href="javascript:void(0);" onclick="functionname()" >aaaa</a> 方法2:<a href="javascript:functionname('dd')" >ddddd</a> 方法3