SignalR 初體驗 Sever-Push For VB.NET 4.0

摘要: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 的網站

SignalR Simple Users On Line Counter

Frank's blog SignalR 初體驗