sirnal下有两种使用。
一种是 Persistent Connection ,另外一种是Hubs 。详细请看 https://github.com/SignalR/SignalR/wiki ;
hubs支持浏览器与客户端互相调用方法。所以应用更广泛。
在前台页面上写上如下脚本:
//初始化signalr function initSignalr(parameters) { var chat = $.connection.chat;//这里的chat为服务器上的继承了HUB的类的HubName。 chat.client.addMessage = function(msg) { $('#submit').trigger('click'); $('#submit2').trigger('click'); }; $.connection.hub.start().done(function() { }); }
上面给client写了一个addmessage方法。之后,服务器将调用它。
下面这条语句执行的方法是空的,但是必须要有:
$.connection.hub.start().done(function() { });在页面加载完毕后会通过此方法向浏览器发送请求。function里可以写一些绑定事件,如:当点击按钮后,
调用了服务器的send方法。send必须是服务器上有的。
$.connection.hub.start().done(function() { $("#broadcast").click(function () { // Call the chat method on the server chat.server.send($('#msg').val()); }); });
$(function () { initDateSelect(); initTableSelect(); resetTableTile(); initSignalr(); })
需要在页面中引入jquery.js,signalr.js以及hubs.js,在mvc中,hub.js可以通过请求服务器获得,
<script src="~/Scripts/jquery-1.7.2.min.js" type="text/javascript"></script> <script src="~/Scripts/jquery.signalR-1.0.1.min.js" type="text/javascript"></script> <script src="~/signalr/hubs" type="text/javascript"></script>服务器在global.asax中注册映射:
RouteTable.Routes.MapHubs();编写类继承自hub: 服务器中 实现了上面的send
namespace CYINC.MOMain.Plugin.LiveCharts.Connection { [HubName("chat")] public class DJ_Connection : Hub { public void Send(string message) { Clients.All.addMessage(message); } } }
注意,这里的DJ_Connection继承了Hub,并且它有一个特性HubName:chat, 还记得页面中这个么:
var chat = $.connection.chat;//这里的chat为服务器上的继承了HUB的类的HubName。chat是你需要建立hub连接的class的HubName的值。
在controller中,新建action对上面的类调用: addMessage为客户端的脚本中的方法,所以脚本中,此方法也必须有实现。
//通过web请求向客户端发送消息 public ActionResult Send() { var context = GlobalHost.ConnectionManager.GetHubContext<DJ_Connection>(); context.Clients.All.addMessage("Admin");//这里的admin是随便写的,因为客户端并不需要接收此消息,仅仅是收到消息ajax重新请求数据 return null; }
不能够直接访问Hub的对象。必须要这样才行:
var context = GlobalHost.ConnectionManager.GetHubContext<DJ_Connection>();
这样就能通过给发送http请求,来触发send方法,send方法通过hub调用客户端(浏览器)的addMessage方法。来控制所有客户端做一些事情。比如一起更新数据等。
====================================================================
sql server的表触发器可以这样写:(首先开启数据库的clr支持)
--开启数据库CLR 支持 exec sp_configure 'clr enabled', 1; --开始数据的验证 alter database MOMain set TRUSTWORTHY on;--相应数据库 RECONFIGURE
数据库clr集成的dll这样写,当数据库触发CallWeb方法时,发送上面的send请求给服务器:
namespace SqlDependency { public class Program { /// <summary> /// 给指定的URL发送请求,服务器收到请求将通知客户端拉数据,此dll将集成到数据库的触发器 /// </summary> /// <param name="url"></param> /// <returns></returns> [SqlFunction(IsDeterministic = true, DataAccess = DataAccessKind.Read)] public static String CallWeb(String url) { WebRequest req = WebRequest.Create(url); var rep = req.GetResponse(); return "1"; } } }编译后,将此dll集成到数据库:
use MOMain;--数据库名 create assembly SqlDependency FROM 'D:\SqlDependency.dll'--程序集名称和地址 WITH PERMISSION_SET = UNSAFE GO --方法名写正确,为程序集中的方法名,注意参数个数 create function CallWeb(@FileFullName as nvarchar(max)) returns nvarchar(max) with returns null on null input external name [SqlDependency].[SqlDependency.Program].[CallWeb] GO --编写触发器,传递参数以及 CREATE TRIGGER [dbo].[UserTableChangedEvent] on [dbo].[dj_chanchu_10min] --表名称 FOR INSERT, DELETE, UPDATE --当有增删改时,触发器将被触发 AS BEGIN DECLARE @URL AS VARCHAR(150) SET @URL = 'http://localhost/djcharts/send'; --服务器接收请求的url Select dbo.WriteStringToFile(@URL) END GO
这样,当表数据有变化时。会发送http请求给服务器,服务器通知所有的浏览器重新拉一次数据。做到了实时更新,实时监控。