mvc 下的 signalR使用小結

sirnal下有兩種使用。 javascript

一種是 Persistent Connection ,另一種是Hubs 。詳細請看 https://github.com/SignalR/SignalR/wiki ; html

hubs支持瀏覽器與客戶端互相調用方法。因此應用更普遍。 java

在前臺頁面上寫上以下腳本: jquery


//初始化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方法。以後,服務器將調用它git

下面這條語句執行的方法是空的,可是必需要有github


$.connection.hub.start().done(function() {
        });
在頁面加載完畢後會經過此方法向瀏覽器發送請求。function裏能夠寫一些綁定事件,如:當點擊按鈕後,


調用了服務器的send方法。send必須是服務器上有的web


$.connection.hub.start().done(function() {
            $("#broadcast").click(function () {
                // Call the chat method on the server
                chat.server.send($('#msg').val());
            });
        });


而後在document ready方法中註冊此方法:
$(function () {
            initDateSelect();
            initTableSelect();
            resetTableTile();
            initSignalr();
        })


須要在頁面中引入jquery.js,signalr.js以及hubs.js,在mvc中,hub.js能夠經過請求服務器得到, ajax


<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, 還記得頁面中這個麼: sql

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請求給服務器,服務器通知全部的瀏覽器從新拉一次數據。作到了實時更新,實時監控。

相關文章
相關標籤/搜索