基於 AJAX和Webservice 的長輪詢(long-polling)方式ServerPush
開始是想試着做基於單純的AJAX的ServerPush,可試了很多次,同一段代碼程序時好時壞,壞時壞較多,達不到目的。而我對AJAX也是太菜了最終也沒找到原因,希望以後能知道其真正原因。考慮是不是SOAP起到了作用,有待考證。
後來換了想法用webService可以達到目的。具體思路其實就是模擬一個ServerPush,只爲了說明這種方法可以實現所一代碼是儘量的簡單. 入口是Browser的一次調用Webservice開始。沒有實時數據只在Server端將程序阻塞一定時間在發送,實際中這了是可以等待一個實時數據的產生。代碼很簡單,不過程序是AJAX Enabled WebSite 又因爲用到了Microsoft.Web.Preview.dll所以需要同時安裝ASPAJAXExtSetup.msi、ASPAJAXCTP.msi,可以在www.ajax.asp.net找到相應下載頁面。
代碼中sleep的時間是2秒,最長測試過20分鐘這種http的長連接沒有斷。
Webservice 很簡單就是sleep後return服務器時間:
- [WebMethod]
- public string GetHelloWorldString(string name)
- {
- System.Threading.Thread.Sleep(1000*2);
- return string.Format("Welcome to ASP.NET AJAX world, {0}!. Now it is {1}.", name, DateTime.Now);
- }
Web前臺也很簡單,不過如果沒使用過asp.net ajax需要產看一些資料,不過就是看代碼也能明白調用過程,只不過ajax的使用是在asp.net ajax的加載的JavaScript文件裏:
- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="AjaxHttp.aspx.cs" Inherits="AjaxHttp" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" >
- <head runat="server">
- <title>http sever push 試驗</title>
- <script type="text/javascript">
- var g_tbName = null;
- var g_btnSayHello = null;
- var g_lbMessage = null;
- function pageLoad()
- {
- g_tbName = new Sys.Preview.UI.TextBox($get('tbName'));
- g_tbName.initialize();
- g_btnSayHello = new Sys.Preview.UI.Button($get('btnSayHello'));
- g_btnSayHello.initialize();
- g_lbMessage = new Sys.Preview.UI.Label($get('lbMessage'));
- g_lbMessage.initialize();
- }
- function getServerHelloString()
- {
- WebService.GetHelloWorldString(g_tbName.get_text(), cb_getServerHelloString);
- }
- function cb_getServerHelloString(result)
- {
- g_lbMessage.set_text(result);
- getServerHelloString();
- }
- </script>
- </head>
- <body>
- <form id="form1" runat="server">
- <asp:ScriptManager ID="ScriptManager1" runat="server">
- <Services>
- <asp:ServiceReference InlineScript="True" Path="WebService.asmx" />
- </Services>
- <Scripts>
- <asp:ScriptReference Assembly="Microsoft.Web.Preview" Name="PreviewScript.js" />
- </Scripts>
- </asp:ScriptManager>
- <div>
- <label for="tbName">Your Name:</label><input id="tbName" type="text" />
- <input id="btnSayHello" type="button" value="提交" onclick ="getServerHelloString();" />
- <div id="lbMessage">
- </div>
- </div>
- </form>
- </body>
- </html>
輸入字符,提交可以看到同步了服務器時間,頁面不是這個提交。
由於項目的原因可能最近不能更多的去研究這個了,不過感覺ServerPush是支潛力股,以後一定深入學習,希望高人指點。
源代碼已經上傳。http://download.csdn.net/download/jjjjj102310253/908563