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

在“新版微软一站式示例代码库发布 - 绑定第三版示例代码浏览器”中,有若干最新的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 Object, ByVal 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!
" End If End Sub
这个函数就是当“发送消息”按钮按下时,将客户端的消息写到后台的静态类中。
Message.vb、ClientAdapter.vb、Client.vb这三个文件是后台的消息处理静态类,和本文的质疑无关。就不详细说了。
再看看Dispatcher.asmx.vb,服务器端返回消息的WebService。它将合适的消息返回给调用者。
Public Function WaitMessage(ByVal userName As String) As String Return ClientAdapter.Instance.GetMessage(userName) End Function
最后看看Receiver.aspx,客户端获得消息的页面。它是如何获得后台即时消息的。
Protected Sub Page_PreRender(ByVal sender As Object, ByVal 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 {0}. It is waiting for new message now.", userName) ' Disable the login. tbUserName.Visible = False btnLogin.Visible = False End If End Sub
从这一段代码可以看出,在页面完成时,注册了一个JS代码,这个代码是waitEvent();
我们看看这个页面的waitEvent()的代码,看看做了一些什么事。

这一段的JS代码,是调用后台的WebService,将后台的消息显示到页面上。
可是,为了达到“实时”的效果。它用了下面的一句话
setTimeout(waitEvent, 0);
第二个参数是0,也就意味着是立即调用。
通观整个waitEvent代码,实际上就是一个不停的调用后台的WebService,来获得消息。这似乎还是客户端是主动端,而且由于是一刻不停的调用后台的WebService,岂不是比间隔一段时间调用后台的WebService更加耗费资源吗?如果客户端只有一个还好,若是有成百上千的这样的客户端,那服务器岂不是负担很重?
这是我看了源代码后的质疑。也许是哪儿我理解错了。望网友指正赐教。
Tags:  商品代码库 代码库 微软代码库 微软示例代码库 微软一站式代码库

延伸阅读

最新评论

发表评论