质疑贴——对《新版微软一站式示例代码库》中的一个示例的质疑

简介:

在“新版微软一站式示例代码库发布 - 绑定第三版示例代码浏览器”中,有若干最新的asp.net的示例。

  对其中的一个示例的源代码研究了一番。觉得有问题,故在此阐述本人的疑问,望广大网友赐教。

  先把这个示例的说明贴在下方。

  CSASPNETReverseAJAX, VBASPNETReverseAJAX

  Downloads 
CSASPNETReverseAJAX: http://code.msdn.microsoft.com/CSASPNETReverseAJAX-7a1f0c2b 
VBASPNETReverseAJAX: http://code.msdn.microsoft.com/VBASPNETReverseAJAX-321a68b0

  反向Ajax又叫Comet模式Ajax, 推模式Ajax, 双向Web和 服务器推模式. 这种技术维护着一个HTTP请求来允许服务器向浏览器推送数据, 而不需要每隔一段特定的时间不断地向服务器提交请求. 这个示例演示了如何在ASP.NET Ajax里使用这种技术。

  

  按照上文的文字的理解。应该是浏览器这一端是被动方。而服务器这一端是主动方。服务器在获得消息的更新后,主动通知客户端更新消息的内容。如果是这样就太好了。可是看了源代码后,却发现貌似不是那么一回事。要么就是自己的理解上有问题。

  先看看各个文件的作用

  Sender.aspx                  客户端发送消息的页面

  Receiver.aspx                  客户端获得消息的页面

  Message.vb、ClientAdapter.vb、Client.vb    服务器端处理消息的类(采用单实例模式,有点像静态类)

  Dispatcher.asmx.vb               服务器端返回消息的WebService

 

  那么看看各个文件的关键部分的代码

  先看看Sender.aspx,客户端发送消息的页面

  Protected Sub btnSend_Click(ByVal sender As ObjectByVal e As EventArgs
' Create a message entity to contain all necessary data. 
Dim message As New Message() 
message.RecipientName = tbRecipientName.Text.Trim() 
message.MessageContent = tbMessageContent.Text.Trim() 
 
If Not String.IsNullOrWhiteSpace(message.RecipientName) AndAlso Not String.IsNullOrEmpty(message.MessageContent) Then 
' Call the client adapter to send the message to the particular recipient instantly. 
ClientAdapter.Instance.SendMessage(message) 
 
' Display a timestamp. 
lbNotification.Text += DateTime.Now.ToLongTimeString() & ": Message sent!<br/>
End If 
End Sub

  这个函数就是当“发送消息”按钮按下时,将客户端的消息写到后台的静态类中。

    

  Message.vb、ClientAdapter.vb、Client.vb这三个文件是后台的消息处理静态类,和本文的质疑无关。就不详细说了。

 

  再看看Dispatcher.asmx.vb,服务器端返回消息的WebService。它将合适的消息返回给调用者。

  <WebMethod()>Public Function WaitMessage(ByVal userName As StringAs String 
Return ClientAdapter.Instance.GetMessage(userName) 
End Function

 

  最后看看Receiver.aspx,客户端获得消息的页面。它是如何获得后台即时消息的。

  Protected Sub Page_PreRender(ByVal sender As ObjectByVal e As EventArgs) 
' Activate the JavaScript waiting loop. 
If Session("userName"IsNot Nothing Then 
Dim userName As String = DirectCast(Session("userName"), String
 
' Call JavaScript method waitEvent to start the wait loop. 
ClientScript.RegisterStartupScript(Me.[GetType](), "ActivateWaitingLoop""waitEvent();"True
 
lbNotification.Text = String.Format("Your user name is <b>{0}</b>. It is waiting for new message now.", userName) 
 
' Disable the login. 
tbUserName.Visible = False 
btnLogin.Visible = False 
End If 
End Sub

  从这一段代码可以看出,在页面完成时,注册了一个JS代码,这个代码是waitEvent();

  我们看看这个页面的waitEvent()的代码,看看做了一些什么事。

  <script type="text/javascript"> 
// This method will persist a http request and wait for messages. 
function waitEvent() { 
 
VBASPNETReverseAJAX.Dispatcher.WaitMessage("<%= Session("userName") %>",  
function (result) {        
displayMessage(result); 
// Keep looping. 
setTimeout(waitEvent, 0); 
},

        function () { 
           // Keep looping. 
setTimeout(waitEvent, 0); 
}); 

 

    // Append a message content to the result panel. 
function displayMessage(message) { 
var panel = document.getElementById("<%= lbMessages.ClientID %>"); 
 
panel.innerHTML += currentTime() + ": " + message + "<br />"; 

 
// Return a current time string. 
function currentTime() { 
var currentDate = new Date() 
return currentDate.getHours() + ":" + currentDate.getMinutes() + ":" + currentDate.getSeconds(); 

</script>

 

  这一段的JS代码,是调用后台的WebService,将后台的消息显示到页面上。

  可是,为了达到“实时”的效果。它用了下面的一句话

  setTimeout(waitEvent, 0); 

  第二个参数是0,也就意味着是立即调用。

  通观整个waitEvent代码,实际上就是一个不停的调用后台的WebService,来获得消息。这似乎还是客户端是主动端,而且由于是一刻不停的调用后台的WebService,岂不是比间隔一段时间调用后台的WebService更加耗费资源吗?如果客户端只有一个还好,若是有成百上千的这样的客户端,那服务器岂不是负担很重?

 

  这是我看了源代码后的质疑。也许是哪儿我理解错了。望网友指正赐教。

 


    本文转自万仓一黍博客园博客,原文链接:http://www.cnblogs.com/grenet/archive/2011/04/21/2023336.html,如需转载请自行联系原作者

相关文章
|
7月前
|
安全 AndFix 网络安全
海外版交易所系统开发指南教程/需求步骤/案例详细/源码逻辑
Determine the functional requirements of the overseas version of the exchange system, including user registration, identity verification, trading, deposit and withdrawal, data statistics, etc
|
17天前
|
监控 搜索推荐 安全
探究亚马逊详情API接口:开发与应用
在数字化时代,亚马逊作为全球领先的电商平台,为商家和消费者提供了丰富的商品信息和便捷的购物体验。本文深入探讨了亚马逊详情API接口的获取与运用,帮助开发者和商家实时监控商品数据、分析市场趋势、优化价格策略、分析竞争对手、构建推荐系统及自动化营销工具,从而在竞争中占据优势。文章还提供了Python调用示例和注意事项,确保API使用的安全与高效。
45 3
|
4月前
|
开发者 存储 API
Xamarin 开发者的社区资源概览:从官方文档到GitHub示例,全面探索提升开发技能与解决问题的多元化渠道与实用工具
【8月更文挑战第31天】Xamarin 开发者社区资源概览旨在提升开发效率与解决问题,涵盖官方文档、社区论坛、GitHub 项目等。官方文档详尽,涵盖 Xamarin.Forms 使用、性能优化等;社区论坛供交流心得;GitHub 提供示例代码。此外,第三方博客、视频教程及 Xamarin University 等资源也丰富多样,适合各阶段开发者学习与提升。通过综合利用这些资源,开发者可不断进步,应对技术挑战。
50 0
|
3月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
241 0
|
3月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
153 0
|
7月前
|
小程序 安全 物联网
社区每周丨通过模板开发小程序文档更新及蚂蚁数据安全星计划推出(7.17-7.21)
社区每周丨通过模板开发小程序文档更新及蚂蚁数据安全星计划推出(7.17-7.21)
69 11
|
IDE 安全 数据可视化
优雅!用了这两款插件,我成了整个公司代码写得最规范的码农
我:我写的代码怎么可能不规范,不要胡说。 于是同事打开我的 IDEA ,安装了一个插件,然后执行了一下,规范不规范,看报告吧。
|
机器学习/深度学习 自然语言处理 前端开发
无需GPT-3!国外小哥徒手开发Text2Code,数据分析代码一键生成
近日,两个外国小哥Kartik Godawat 和 Deepak Rawat 开发了一个 Jupyter 插件Text2Code,可以将自然语言查询转换成相关的 Python 数据分析代码。
287 0
无需GPT-3!国外小哥徒手开发Text2Code,数据分析代码一键生成
|
存储 人工智能 搜索推荐
GitHub核心功能向全球4000万开发者免费开放!私有库可无限协作,大AI模型随便放
GitHub宣布私有库免费向团队和个人开发者开放,不再设立人数限制。除了这个大福利,企业版本也降低了价格,还提供免费的持续集成和超大存储空间,今天我们就先睹为快,看看GitHub这些新特性。
386 0
GitHub核心功能向全球4000万开发者免费开放!私有库可无限协作,大AI模型随便放
|
人工智能 自然语言处理 JavaScript
重磅!GitHub 推出 AI 自动写代码神器,再也不用到处找代码了…
大家好,我是你们的码农大哥——栈长。 3 年前,自 微软收购 Github 后大动作不断啊,两年多之前就让 Github 私库免费了!,后面还推出了 Github for Mobile 移动版,这些我都已经在公众号Java技术栈作过分享,没看过的可以回过头看下。 最近,Github 又搞大事了,推出了一款 AI 编程神器——Github Copilot,牛逼啊,下面栈长带大家来看看到底是什么鬼?
959 0
重磅!GitHub 推出 AI 自动写代码神器,再也不用到处找代码了…