客户端(桌面应用程序)拉取数据...但我希望服务器(Web应用程序)推送数据。

7
我有一个客户端-服务器应用程序,其中服务器实际上是一个ASP .NET Web应用程序,分布式客户端是桌面应用程序。
客户端需要在有新数据时从服务器接收一些数据。目前,这是通过客户端每隔x分钟(比如2分钟)查询Web服务并检查是否有新数据来完成的。
理想情况下,桌面应用程序应该在可用时立即接收更新,而不需要从服务器拉取;相反,服务器应该能够向客户端推送数据。
鉴于解决方案的架构 - 一个Web应用程序需要将数据推送到同一网络(LAN)中的桌面应用程序(客户端),我该怎么做呢?
5个回答

8
你所描述的是"服务器推送",这在现今常常被称为"COMET"。使用这些关键词进行网页搜索应该能找到很多有用的信息。
最常见的技术叫做"悬挂式GET"。客户端向指定URL发送一个GET请求,服务器接受连接但延迟发送响应直到有数据可以发送。当客户端接收到响应后,它会再次发送一个GET请求以准备接受下一条消息。

1
只是想提醒一下,您可以使用IHttpAsyncHandler(http://msdn.microsoft.com/en-us/magazine/cc164128.aspx)和System.Threading.Monitor在.NET 2.0中轻松构建(某种程度上的)事件驱动的“服务器推送”。 如果有人知道一个完整的实用类,请发布一些链接。 - Radu094
对于每个客户端,服务器必须保持一个套接字连接处于活动状态。因此,当无法预测客户端数量时,它将无法正常工作。 - Amit

2

您可以使用WCF回调 - 这是一种Web服务,您可以订阅来自客户端的通知,服务器将向已订阅的客户端发送消息。我在我的博客上有一个初学者指南


WCF?不仅仅是.NET 2.0吗?遗憾的是,我需要在.NET 2.0的限制下工作?在这种情况下,WCF回调有帮助吗? - Sameet
不好意思,它只支持 WCF。 - blowdart

1

看看WebSync吧;它是一个针对ASP.NET/IIS的Comet解决方案,但也有一个完整的.NET客户端可用,可以与厚客户端、Windows服务等集成。因此,它听起来应该非常适合您的需求。


1

你可能会对Stack Overflow的问题感兴趣。你所描述的听起来像是一个Comet应用程序 - 服务器向客户端推送。


0
如果您可以保持套接字打开状态,客户端就可以连接到服务器,服务器只需在适当的时候通过套接字向下推送数据。没有理由认为发起连接的一方必须始终是发起数据传输的一方。

这个应用程序适用于行业内的一般内部网络。使用套接字连接 - 即使用套接字需要打开一个端口以便访问 - 需要重新配置防火墙等等。这是一个合理的安装前提条件,还是工业客户通常会反对这样做? - Sameet
一个HTTP连接就是一个套接字。这个答案(正确地)建议客户端发送一个GET请求,但服务器要延迟发送响应,直到它有数据准备好发送。 - Jens Alfke
是的,但HTTP连接在80端口上,这不会被防火墙阻止吗?你描述的听起来很完美——服务器推迟响应直到它有数据——如何做到这一点? - Sameet
是的,但HTTP连接在端口80上,而该端口不会被防火墙阻止吗?如果端口80被阻止,则您将没有工作的Internet / Intranet连接。如果HTTP有效,请使用已配置的任何端口。 - Sandeep Datta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接