摘要:SignalR 初體驗 Sever-Push For VB.NET 4.0
好久沒上來做做筆記,發覺很多事都會遺忘!囧~~還是勤勞點好
直接插入正題
最近剛好會用到所謂Real-Time的東東
也做了不少資料的搜集
隨然之前有做long polling的應用
但在去年發現SignalR 這套件的時候真的是驚為天人
把底層封裝的太完美了,簡易使用
剛好網路上很多前輩無私的分享就趁機拿來現學現賣
當然這一兩天也碰了不少璧,會稍微在文章內提出
也希望如果有前輩前往,有需要改進的地方也不吝提出建言
當然免不了第一步透過NuGet去下載安裝套件
在指令中輸入:Install-Package Microsoft.AspNet.SignalR
與:Install-Package Microsoft.AspNet.SignalR.Client
接著在Global.asax 加入參考
Imports Microsoft.AspNet.SignalR
Imports System.Web.Routing
並在Application_Start中加入
RouteTable.Routes.MapHubs()
但在.NET4.5中不加並不會造成影響
之後在到頁面中的head將所需的JS引用進來
<script src="Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR-1.1.3.min.js" type="text/javascript"></script>
<script src="./signalr/hubs"></script>
紅字這段是由sever產生出來,所以實際上你並不會看到這個檔案
是在建置時會呈現在前端的頁面上!必加!!!
新增一個類別DemoPush.vb
Imports System.Collections.Generic
Imports System.Web
Imports Microsoft.AspNet.SignalR
Imports Microsoft.AspNet.SignalR.Client
Imports System.Threading.Tasks
Imports System.Threading
Imports System.Web.Script.Serialization
Imports System.Data
Public Class DemoPush
Inherits Hub
Public Shared pushTask As Task = Nothing
Public Shared users As New List(Of String)()
'OnConnected,OnReconnected,OnDisconnected
'實作連線,連線中斷,重連
Public Overrides Function OnConnected() As System.Threading.Tasks.Task
Dim clientId As String = GetClientId()
If users.IndexOf(clientId) = -1 Then
users.Add(clientId)
End If
ShowPush()
Return MyBase.OnConnected()
End Function
Public Overrides Function OnReconnected() As System.Threading.Tasks.Task
Dim clientId As String = GetClientId()
If users.IndexOf(clientId) = -1 Then
users.Add(clientId)
End If
ShowPush()
Return MyBase.OnReconnected()
End Function
Public Overrides Function OnDisconnected() As System.Threading.Tasks.Task
Dim clientId As String = GetClientId()
If users.IndexOf(clientId) > -1 Then
users.Remove(clientId)
End If
ShowPush()
Return MyBase.OnDisconnected()
End Function
Private Function GetClientId() As String
Dim clientId As String = ""
If Not (Context.QueryString("clientId") Is Nothing) Then
'clientId passed from application
clientId = Context.QueryString("clientId").ToString()
End If
If clientId.Trim() = "" Then
'default clientId: connectionId
clientId = Context.ConnectionId
End If
Return clientId
End Function
Public Sub ShowPush()
pushTask = New Task(Sub()
While True
If users.Count > 0 Then
For Each item In users
Clients.All.ShowTimeNow(DateTime.Now.ToString())
Next
End If
Thread.Sleep(1000)
End While
End Sub)
pushTask.Start()
pushTask = Nothing
End Sub
End Class
在Client則是
$(document).ready(function () {
/*
demoPush在Client需小寫
建立連線
*/
var push = $.connection.demoPush;
$.connection.hub.start().done(function () {
/*
當連線完成做什麼樣的事件觸發
*/
/*
觸發Sever端的function
showPush()
*/
push.server.showPush();
});
/*
接收回傳的資料
*/
push.client.ShowTimeNow = function (d) {
$('#time').html(d);
};
});
只是在4.5與4.0中發現一些小小的差異
例如在.Net4.5中Server端,在回傳Client內並未有ALL這玩意
包括在Client中你如果是用push.client.ShowTimeNow...
在頁面上會出現沒有Client這個 Function
當然最後附上完整圖示
參考連結
[.NET]SignalR簡介 - 建立 realtime 的網站