序
浏览器通过HTTP协议访问网页,浏览器发送请求,服务器返回结果。服务器被动地接收请求。如果要反转,服务器主动给浏览器发送信息怎么办?
有很多解决方案,比如循环(浏览器定期询问服务器是否有新数据)、WebSocket (HTML 5).
SignalR是这些技术的组合,它会自动识别当前浏览器支持哪些方法,然后选择最佳方法。我们在开发的时候不用关注这些细节,Signaler会帮助我们实现。而且Signaler是微软开发的,好用永远是风格。
环境。NET 4.5及以上,太低了。
如果Visual Studio太旧,没有SignalR,请按如下方式添加:
在Visual Studio的菜单“工具-库包管理器-管理NuGet解决方案包(仅在打开解决方案后)”,在弹出的对话框中搜索“SignalR”。
我使用的Visual Studio 2013不需要手动添加SignalR,它是自带的。
实际战斗
打开Visual Studio(我的版本是2013年),创建一个ASP.NET项目。
第一步是添加一个“信号员永久连接类”
下图:
添加之后,我们可以发现Visual Studio已经自动为我们添加了一些引用,还有Scripts文件夹(里面包含jquery . signal-2 . 0 . 0 . js)。这个类的初始代码如下:
公共类my Connection 1 : persistent Connection {受保护的覆盖任务OnConnected(IRequest请求,字符串connectionId) {返回连接。发送(连接标识,“欢迎!”);}受保护的覆盖任务已接收(请求,字符串连接标识,字符串数据){返回连接。广播(数据);}}第二步:添加“OWIN创业班”
然后添加一个点代码:
公共类启动1 {公共Void配置(IAPP构建器App){//有关如何配置应用程序的更多信息,请访问http://go.microsoft.com/fwlink/? LinkID=316888 App。mapsignalmyconnection1(“/my path”);//myPath是随便写的。}}MyConnection1是在第一步中创建的类名。
步骤3:添加一个“网络表单”
text area id=' info ' cols=' 60 ' rows=' 10 '/text area script src=' http : script/jquery-1 . 10 . 2 . min . js '/script script src=' http : script/jquery . signor-2 . 0 . 0 . min . js '/script script type=' text/JavaScript '!- var conn=$。连接('/my path ');Conn.start()。完成(函数(数据){$ ('# info '))。追加('连接成功,connectionId为:' data . id ' r n ');});Conn.received(函数(数据){$ ('# info '))。追加('接收的数据:'数据' r n ');});/////脚本运行如下:
展开它
我的连接1:
OnConnected方法:创建连接时。
方法OnReceived:当接收到客户端提交的数据时,参数数据就是它接收到的数据。
方法OnDisconnected:当连接断开时。上面没用。
方法OnReconnected:当重新连接时。上面没用。
.……我的连接1的连接属性:
方法发送:向浏览器发送数据,第一个参数是connectionId(字符串类型),第二个参数是要发送的数据。
方法广播:将数据发送到所有浏览器(准确地说,所有连接)。
JS:
var conn=$。连接('/my path ');创建连接对象。Conn.start()。done() start()是启动连接并成功连接done()后要执行的代码。Conn.received()将在接收到服务器发送的数据后执行。Conn.send()是向服务器发送数据。上面没用。让我们看看更完整的代码:
以上并不是说有些方法没用,而是下面的例子比较完整:
我的连接1:
受保护的覆盖任务已连接(IRequest请求,字符串connectionId){ 0返回连接。发送(连接标识,"欢迎!");}受保护的覆盖任务已接收(请求,字符串连接标识,字符串数据){连接。发送(连接标识,'我收到了:' '数据);返回连接。广播('全体注意:我收到了客户端的数据。');}Web窗体的代码:
文本区域id=' info ' cols=' 60 ' row=' 10 '/文本区域要发送到服务器的消息:输入类型=' text ' id=' msg ' size=' 20 '/输入类型='按钮'值='发送消息onclick=' JavaScript : conn . send($(' # msg ')).val());"/script src=' http : script/jquery-1。10 .2 .量滴js '/script script src=' http : script/jquery。二号先生。0 .0 .量滴js/script脚本类型=' text/JavaScript '!- var conn=$ .连接('/我的路');conn.start().完成(函数(数据){ $('#info ').追加('连接成功,connectionId为:'数据。id ' r n ');});conn.received(函数(数据){ $('#info ').追加('收到数据:"数据" r n ');});////脚本到目前为止,大家可能都提不起兴趣,服务器主动发送数据在哪里?
我们现在做一个定时程序,服务器定时向浏览器发送数据。
新建Global.asax(全局应用程序类)(并不是说这些代码只能在Global.asax中运行,我们只是为了测试定时执行,才放在这里的)。
添加如下代码:
受保护的作废申请_开始(对象发送方,事件参数e){定时器定时器=新定时器(5000);计时器。已用=定时器_已用;计时器start();} void timer _ Overed(对象发送方,ElapsedEventArgs e){ var context=全局主机.ConnectionManager。GetConnectionContextMyConnection1();语境。连接。广播('我在日期时间。'现在。' ToString()'主动向浏览器发送数据。');}效果如下:
以上代码,我们用的是语境。连接。广播,如果是针对某一连接发送,则用发送方法,这就需要connectionId,不过要选择哪个connectionId都是业务层面的事,不是问题。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。