我有一个需求,需要在Web上进行实时更新(ASP.NET MVC)。唯一能扭转现状的方法是实现COMET技术(ServerPush/Reverse)技术。
场景是:用户A将消息保存在不同的网站客户端中。然后,用户B将自动获取用户"A"在不同浏览器中所做的更新。
实际上,我通过这个体系结构完成了解决方案:ASP.NET MVC -在WCF上执行jquery (post)请求(长池)。WCF -在数据库( Server)上做一些轮询,间隔1秒。如果已将新数据添加到数据库中,则轮询将与客户端上返回的数据中断。
WCF彗星方法伪码:
private Message[] GetMessages(System.Guid userID)
{
var messages = new List<Message>();
var found = false;
/* declare connection, command */
while (!found )
{
try
{
/* open connection - connection.Open(); */
/* do some database access here */
/* close connection - connection.Close(); */
/* if returned record > 0 then process the Message and save to messages variable */
/* sleep thread : System.Threading.Thread.Sleep(1000); */
found = true;
}
finally
{
/* for sure, incase of exception */
/* close connection - connection.Close(); */
}
}
return messages.ToArray();
}我的关注和问题是:是否是在WCF (间隔1秒)中执行轮询技术的最佳方法?
原因:我最大限度地使用了数据库连接池,并且我期望这种技术没有问题。
注释:--这是一个多线程实现,下面使用WCF给定的属性。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall), ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = true)]发布于 2011-08-14 09:12:46
我建议使用专用的实时服务器(即,不要在IIS中承载WCF服务)或使用托管服务进行实时更新。正如安德斯所说,IIS并不擅长处理多个长期运行的并发请求。
我还建议您考虑使用一种使用WebSockets的解决方案,该解决方案支持辅助解决方案,如Flash、HTTP流、HTTP长轮询以及可能的轮询。WebSockets是客户端和服务器之间全双工双向通信的第一种标准化方法,最终将为任何此类问题提供更好的解决方案。
就目前而言,实现自己的Comet/WebSocket实时解决方案肯定是一项耗时的任务(正如您可能已经发现的那样),特别是在构建一个面向公共的应用程序时,用户可以使用多种不同的浏览器访问它。
考虑到这一点,XSockets项目看起来非常有趣,SuperWebSocket项目也是如此。
我所知道的.NET Comet解决方案来自FrozenMountain,它有一个用于IIS的WebSync服务器。还有PokeIn。
我已经编译了一个实时web技术列表,它可能也很有用。
发布于 2011-08-12 12:24:21
不是轮询数据库,而是在更新时发送事件吗?无论如何,这就是我实现Pub/Sub场景的方式,而且它工作得很好。
https://stackoverflow.com/questions/7039298
复制相似问题