SignalR 的實現機制與 .NET WCF 或 Remoting 是相似的,都是使用遠程代理來實現。在具體使用上,有兩種不同目的的接口:PersistentConnection 和 Hubs,其中 PersistentConnection 是實現了長時間的 Javascript 輪詢(類似於 Comet),Hub 是用來解決實時信息交換問題,它是利用 Javascript 動態載入執行方法實現的。SignalR 將整個連接,信息交換過程封裝得非常漂亮,客戶端與服務器端全部使用 JSON 來交換數據。
下面就 Hubs 接口的使用來講講整個流程:
1,在服務器端定義對應的 hub class;
2,在客戶端定義 hub class 所對應的 proxy 類;
3,在客戶端與服務器端建立連接(connection);
4,然后客戶端就可以調用 proxy 對象的方法來調用服務器端的方法,也就是發送 request 給服務器端;
5,服務器端接收到 request 之后,可以針對某個/組客戶端或所有客戶端(廣播)發送消息。
最后實現的效果圖:
一個是推送信息服務器端(之后我會把它搞成一個windows服務),一個推送信息客戶端,一個WebClient;
解決方案1和解決方案2?為什么要建兩個解決方案,我怕有的同學搞混。
Solution 1:
SignalR.Lib 放的是SignalR的一些類庫(Client 和Server 都引用這個項目),至於目的——你懂得!需要安裝什么樣的DLL,用nuget去down
通過Nuget控制台
PM> Install-Package Microsoft.AspNet.SignalR.SelfHost
PM> Install-Package Microsoft.Owin.Cors
PM>Install-Package Microsoft.AspNet.SignalR.Client
注意:裝的時候可能會遇見一個錯誤就是關於dll 和.net freamwork 間版本的問題
先把Server打開:
Task.Run(() => srv.Start(ServerURL))
myHub類需要繼承Hub類
需要先執行異步連接這個方法:
private async void ConnectAsync() { try { string url = "http://localhost:8080/signalr"; HubConnection Connection = new HubConnection(url); HubProxy = Connection.CreateHubProxy("MyHub"); await Connection.Start(); } catch (Exception ex) { return; } }
Solution 2:也就是你要推送的站點(記着host配起來)
mvc頁面的js代碼需要引用的js有
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script src="~/Scripts/art.dialog4.1.6/artDialog.js?skin=green"></script>
<script src="~/Scripts/art.dialog4.1.6/plugins/iframeTools.js"></script>
<script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script>
<script src="http://localhost:8080/signalr/hubs"></script>
<script type="text/javascript"> $(function () { $.connection.hub.url = "http://localhost:8080/signalr"; var chat = $.connection.myHub; chat.client.addMessage = function (text) { art.dialog({ title: '推送信息', content: text }); } $.connection.hub.start(); //$.connection.hub.start().done(function () { // alert("end"); //}) }) </script>
SignalR通信模型:(參考地址:http://www.cnblogs.com/wintersun/p/4148223.html)
實時推送的好處就不說了,比之前頻刷數據庫的方式要好不止一點兩點!因為想把它做成一個給在線用戶推送,某些特殊用戶推送,這只算一個雛形吧,需要Demo的小伙伴可以給我發站內信!
今天一天盡然沒洗臉沒刷牙!看了一部電影、寫了一個signalR的Demo!這樣很不好,明天去爬香山!