閒來無事在點部落上壓馬路,無意中發現了SignalR這個強大的套件,它把Real-Time功能封裝,且功能強大。有了它,可以很輕易的實現及時訊息的傳遞(ex:Chat、ProgressBar)。

根據原開發者的設定,SignalR提供了兩種訊息傳遞的開發方式,一種為Hub,另一種為PersistentConnection。兩者比較在朱大的文章中有較詳細的說明,我試玩之後,覺得Hub實作起來較簡單;而PersistentConnection較為彈性。

首先透過擴充管理員以NuGet將SignalR的套件自動安裝到專案或網站上。

一、以Hub實作:

先來建立後端物件

建立BroadCast方法,等待前端頁面呼叫。Clients為基底類別Hub的成員,型別為dynamic,這裡的情境是前台頁面透過呼叫BroadCast傳達訊息,而BroadCast則透過showMessage方法告知所有客戶端所傳達的訊息。showMessage接收到訊息後,要做如何的處理,那是前端的工作了,意味著在前端也要有支名為showMessage的function來對應。

using System.Web;
using SignalR.Hubs; 

[SignalR.Hubs.HubName("myHub")]

public class MyHub: Hub

{

    public void BroadCast(string message)

    {

        this.Clients.showMessage(message);

    }

}

一旦建立了MyHub類別,Signalr會為MyHub自動指定一個路由(Route),其預設路徑為(~/signalr)。若欲修改該預設路徑,須在Global.asax的Application_Start中,加入以下程式碼:

RouteTable.Routes.MapHubs("~/欲修改的路徑名稱");


前端頁面:

<html>

<head runat="server">

    <title></title>

    <script src="Scripts/jquery-1.6.4.js" type="text/javascript"></script>

    <script src="Scripts/json2.js" type="text/javascript"></script> <%--在IE8以下版本,須匯入json2.js,不然會無法作parser,browser報錯--%>

    <script src="Scripts/jquery.signalR-0.5.3.js" type="text/javascript"></script>

    <script src="signalr/hubs" type="text/javascript"></script> <%--SignalR會自動在該路徑上產生前端所需的js程式碼,所以有必要加這行;如在Application_Start修改過路徑名稱,src要改成 src="修改過的名稱/hubs"--%>

    <script type="text/javascript">

        $(document).ready(function () {

            //動態在前台取得後端myHub物件

            var hub = $.connection.myHub;

 

            //動態對muHub物件註冊showMessage function  

            hub.showMessage = function (message) {

                $('#message').append(message + '<br/>');

            }

            //開始連線

            $.connection.hub.start();

 

            //當點擊按鈕後,透過myHubBroadCast方法將訊息傳遞出去

            $('#btnSend').click(function () {

                var msg = $('#txtMsg').val();

                hub.broadCast(msg);

            })

        })

    </script>

</head>

<body>

    <form id="form1" runat="server">

    <input type="text" id="txtMsg" />

    <input type="button" id="btnSend" value="Send" />

 

    <div id="message"></div>

    </form>

</body>

</html>

實作截圖:

1擷取  


二、以PersistentConnection實作

建立一類別MyEndPoint繼承自PersistentConnection,並且override所需的方法,如以下:

using SignalR;

using System.Threading.Tasks;

using SignalR.Hosting;

 

public class MyEndPoint : PersistentConnection

{

    protected override Task OnReceivedAsync(IRequest request, string connectionId, string data)

    {

        return Connection.Broadcast("Connection ID " + connectionId + " 送出訊息: " + data);

    }

    protected override Task OnConnectedAsync(IRequest request, string connectionId)

    {

        return Connection.Broadcast("Connection ID " + connectionId + " 已連線");

    }

    protected override Task OnDisconnectAsync(string connectionId)

    {

        return Connection.Broadcast("Connection ID " + connectionId + " 已斷開");

    }

    protected override Task OnErrorAsync(Exception error)

    {

        return Connection.Broadcast(error.Message);

    } 

}

Global.asax :

<%@ Import Namespace="System.Web.Routing" %>

<%@ Import Namespace="SignalR.Hosting.AspNet.Routing" %>

<%@ Import Namespace="SignalR" %>

<script runat="server">

 

        void Application_Start(object sender, EventArgs e)

        {

            // 應用程式啟動時執行的程式碼

            RouteTable.Routes.MapConnection<MyEndPoint>("echo", "echo/{*operation}");

        }

 </script>

前端頁面:(跟Hub寫法相似)

<html>

<head runat="server">

    <title></title>

    <script src="Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>

    <script src="Scripts/json2.js" type="text/javascript"></script>

    <script src="Scripts/jquery.signalR-0.5.3.js" type="text/javascript"></script>

    <script type="text/javascript">

        $(document).ready(function () {

            var conneciton = $.connection("echo");

            conneciton.received(function (data) {

                $('#message').append(data + '<br/>');

            })

            conneciton.start();

            $('#btnSend').click(function () {

                var msg = $('#txtMsg').val();

                conneciton.send(msg);

            })

        })

    </script>

</head>

<body>

    <form id="form1" runat="server">

    <input type="text" id="txtMsg" />

    <input type="button" id="btnSend" value="Send" />

    <div id="message"></div>

    </form>

</body>

</html>

實作截圖:

2擷取  

參考文章:

https://github.com/SignalR/SignalR/wiki

http://ruwandotnet.wordpress.com/category/signalr/

http://www.dotblogs.com.tw/regionbbs/archive/2012/07/01/introduce.to.signalr.aspx

http://www.dotblogs.com.tw/hatelove/archive/2012/07/01/signalr-introduction-about-realtime-website.aspx

http://msdn.microsoft.com/zh-cn/magazine/hh852586.aspx

http://www.cnblogs.com/Jerry-Chou/archive/2012/04/16/2451571.html

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 忙裡偷閒 的頭像
    忙裡偷閒

    忙裡偷閒的部落格

    忙裡偷閒 發表在 痞客邦 留言(0) 人氣()