Aro*_*ron 5 .net architecture wcf client-server
我们有一个传统的第三方工具(用C/C++开发).该工具有一个服务器组件,它运行一个运行作业的Windows服务器(复杂的链式长数据库查询).它还有一个安装在所有用户桌面上的客户端模块,用户可以添加作业,查看正在运行的作业及其进度,删除作业,即基本上管理作业.我们希望使用.NET技术在内部开发这样的工具.
目前我们正在考虑如何构建这样一个工具,看起来我们错过了一些关键的难题.
客户:我们决定在WPF中开发客户端桌面应用程序
服务器:目前我们正在考虑将其开发为控制台应用程序,但不太确定如何构建它.
我们面临的主要问题是
服务器控制台应用程序如何公开ASMX或WCF Web服务(以便WPF客户端获取作业的状态)何时继续运行作业?
如何在发生更改时将进度更新从服务器推送到WPF客户端?
我们正在尝试研究如何做到这一点,但没有找到任何与该主题相关的事情.任何指向文章/指导的指针都会有很大的帮助.
您所遇到的困惑在于假设作业的执行和 WCF 端点是同一件事。我将其分为三个主要项目:
客户申请
客户端应用程序应通过 WCF 服务检索作业数据。您将提供用于查看正在执行的作业/创建作业/删除作业/等的屏幕。
周转基金服务
WCF 服务将公开客户端应用程序所需的端点。这可能包括以下项目:CreateJob、ViewJobs、DeleteJob 等。该服务应该读取/写入您的数据库后端。
申请工作
作业应用程序将轮询新的/已删除的作业并执行完成作业所需的任何操作。它将更新 WCF 服务从中读取的数据库后端中的作业状态。这可以是 SQL 作业、Windows 服务、控制台应用程序等(我可能会将其设为 Windows 服务,因为您可能需要始终运行的东西来处理作业)。
问题
How can a server console application expose ASMX or WCF web services(so that WPF clients get the status of the jobs) WHILE CONTINUING TO RUN THE JOBS?
通过将 WCF 服务与运行作业的应用程序分离出来,这就可以解决这个问题。注意:您可以拥有一个托管 WCF 和作业执行器的控制台应用程序,但从概念上将它们视为单独的事物(在同一控制台应用程序中托管只是一个实现细节)。
How to push progress updates from server to the WPF clients when there is a change?
我不会这样做。我会让 UI 不时轮询或提供刷新按钮以通过 WCF 端点检索状态。
如果您确实需要这样做,则需要作业执行器在运行作业时发布消息,并且客户端应用程序需要接收这些消息(可能是 MSMQ、服务总线实现、BizTalk 等)。
为什么我更喜欢轮询而不是服务器推送
现在我想起来,在某些情况下我可能会采用推送方式,而在某些情况下我会进行民意调查。
如果我有许多异地客户端(通常通过 VPN 或通过互联网连接),我会让客户端进行轮询,因为带宽和网络延迟的成本过高。如果客户端数量较多,则每条更新消息都需要发送到每个订阅客户端。在这种情况下,我倾向于采用“问而不说”模型。
如果客户在公司内部并且您需要向他们传输实时信息,那么推送模型会更有意义。在这种情况下,您可以将客户端连接到服务器应用程序,并且它们可以通过连接来回发送消息(我个人没有这样做,所以我没有关于如何设置的建议,希望是比套接字更高级别的东西)。
如果您希望在更新发生时收到消息,但客户端位于许多不同的地方,那么发布/订阅模型可能是最好的。在发布/订阅中,应用程序将在更新消息发生时推送更新消息。消息传递系统将检查是否有任何客户端正在订阅消息,并且对于正在订阅消息的所有客户端,消息传递系统将消息的副本转发给他们。在您的示例中,客户端将subscribe发送作业消息,消息系统会将更新发送到客户端指定的位置(客户端需要一种接受消息的方法)。NServiceBus、BizTalk 是此类通信的示例。
| 归档时间: |
|
| 查看次数: |
1621 次 |
| 最近记录: |