基于 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