SignalR介紹與Asp.net



     SignalR 是一個asp.net異步庫,它提供廣播消息到多個client端的機制。 SignalR能用來持久客戶端與服務端的連接,讓我們便於開發一些實時的應用,例如聊天室在線預訂系統,股票交易等實時應用。這可以顯著降低服務器的負載確保沒有不必要的請求從重復客戶端請求。 SignalR是非微軟的正式開源項目。
它實現了Long Polling的模式,可看下面圖示:

longPolling

傳統的 AJAX 應用不同之處在於:

1. 服務器端會阻塞請求直到有數據傳遞或超時才返回。
2. 客戶端 JavaScript 響應處理函數會在處理完服務器返回的信息后,再次發出請求,重新建立連接。
3. 當客戶端處理接收的數據、重新建立連接時,服務器端可能有新的數據到達;這些信息會被服務器端保存直到客戶端重新建立連接,客戶端會一次把當前服務器端所有的信息取回。

  
下面我們來通過一個簡單的小例,首先通過NuGet安裝它:

Install-Package SignalR

在Server端,創建一個MyChat的Class繼承自SignalR.Hubs.Hub類 :

    public class MyChat : Hub
    {
        /// <summary>
        /// Sends the specified message.
        /// </summary>
        /// <param name="message">The message.</param>
        public void Send(string message)
        {
            // Call the addMessage method on all clients         
            Clients.addMessage(message);
        }
    }


現在來看前端頁面,引用相應的客戶端Js腳本,創建連接,綁定事件。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>dev home</title>
</head>
<body>
    <script src="../Scripts/jquery-1.7.2.js"></script>
    <script src="../Scripts/jquery.signalR-0.5.2.js"></script>
    <script src="/signalr/hubs" type="text/javascript"></script>
    <div>
        <script type="text/javascript">
            var chat;
            $(function () {
                // Created proxy            
                chat = $.connection.myChat;
                // Assign a function to be called by the server        
                chat.addMessage = onAddMessage;
                // Register a function with the button click               
                $("#broadcast").click(onBroadcast);
                // Start the connection        
                $.connection.hub.start();
            });
            function onAddMessage(message) {
                // Add the message to the list         
                $('#messages').append('<li>' + message + '</li>');
            }
            function onBroadcast() {
                // Call the chat method on the server           
                chat.send($('#message').val());
            }       
        </script>
        <input type="text" id="message" />
        <input type="button" id="broadcast" value="send" />
        <ul id="messages">
        </ul>
    </div>
</body>
</html>


運行后,我們可以看到每次點擊Button就會把當前的信息廣播到所有客戶端。 使用Fiddler 結果是,當我們提交cc字符串的Request RAW:

POST http://localhost:17347/signalr/send?transport=longPolling&connectionId=8eaf7e6b-f0e9-414a-8e97-68ad7ff02e2b HTTP/1.1
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://localhost:17347/mytest/MyChat.html
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Host: localhost:17347
Content-Length: 131
Connection: Keep-Alive
Pragma: no-cache

data=%7B%22hub%22%3A%22MyChat%22%2C%22method%22%3A%22Send%22%2C%22args%22%3A%5B%22cc%22%5D%2C%22state%22%3A%7B%7D%2C%22id%22%3A1%7D

 

Response RAW:

 

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Thu, 19 Jul 2012 03:12:28 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: private
Content-Type: application/json
Connection: Close
Content-Length: 66

{"State":{},"Result":null,"Id":"1","Error":null,"StackTrace":null}
 
然后從Fiddler中看第3個會話顯示HTTP一直在保持連接, 上面文本是其中第2個會話的RAW.

IEfiddle
 
基於Long Polling,客戶端發出的請求到服務器端沒有回復,直到有數據返回。 Web客戶端保留掛起狀態只有等到服務器返回一些有效的響應才關閉連接。這正是今天我們想要的 --— 潛在減輕的 Web 服務器的壓力。

希望對您Web開發有幫助.

您可能感興趣文章:

用Knockoutjs與Asp.net MVC實現級聯下拉列表

 


作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
該文章也同時發布在我的獨立博客中-Petter Liu Blog


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM