2012-10-12 29 views
5

我们有一个传统的第三方工具(用C/C++开发)。该工具有一个服务器组件,运行一个运行作业的Windows服务器(复杂的链式长数据库查询)。它还具有安装在所有用户桌面上的客户端模块,用户将能够添加作业,查看正在运行的作业及其进度,删除作业,即基本管理作业。我们想要使用.NET技术在内部开发这样的工具。如何在.NET中构建此客户端/服务器应用程序?

目前,我们正在考虑如何构建这样的工具,像我们缺少的拼图的一些关键部分出现。

客户端:我们决定在客户端桌面应用程序在WPF

服务器开发:目前,我们正在考虑开发它作为控制台应用程序,但不太清楚如何构建它。

的主要问题,我们有是

服务器控制台应用程序如何可以公开ASMX或WCF Web服务(使WPF客户获得作业的状态),同时继续运行的作业?

如何从服务器推送最新进展的WPF客户端时有变化?

我们正在努力做研究如何做到这一点,但没有找到相关的主题的任何东西。任何指向文章/指导的指针都将非常有帮助。

+0

可能的重复:http://stackoverflow.com/questions/11170457/discussion-client-server-application-architecture –

+0

@MikeMcCaughan您提到的链接似乎是相似的,但它不是,在我的情况下,我的服务器除了为客户提供服务外,还有很长时间的工作要做。 – Aron

+0

试试这个:http://dasunhegoda.com/architecture-products/1180/ – Techie

回答

3

你有这种混乱是假定任务的执行和WCF端点是一样的。我将它分成三个主要项目:

  1. 具有用于作业管理的UI元素的客户端应用程序。
  2. WCF服务端点检索作业信息并发送创建/删除作业请求。
  3. 运行作业的应用程序。

客户端应用程序

客户端应用程序应通过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端点检索状态。

如果您绝对需要这样做,您需要Job执行者在运行作业时发布消息,并且客户端应用程序需要接收这些消息(可能是MSMQ,Service Bus Implementation,BizTalk等)。

为什么我喜欢轮询服务器推送

现在,我想它有可能情况下,我会做俯卧撑的风格,有些地方我投票。

如果我有很多异地客户端(通过VPN或通过互联网连接),我会让客户端进行轮询,因为带宽和网络延迟成本过高。如果客户端数量很高,则每条更新消息都需要发送给每个订阅客户端。在这种情况下,我倾向于去询问不告诉模型。

如果客户在家,你需要实时的信息流,那么推送模式会更有意义。在这种情况下,客户端可以连接到服务器应用程序,他们可以通过连接来回发送消息(我没有亲自做过这个,所以我没有建议如何设置,希望比套接字更高级别)。

如果这是一种情况,您希望消息作为更新发生,但客户端位于许多不同的地方,那么发布/订阅模型可能是最好的。在pub/sub中,应用程序会在更新消息发生时推送消息。消息传递系统将检查是否有任何订阅消息的客户端,并且所有订阅消息传递系统的客户端都将消息的副本转发给它们。在你的例子中,一个客户端将subscribe作为消息,消息系统会将更新发送到客户端指定的位置(客户端需要一种接受消息的方式)。NServiceBus,BizTalk是这种类型的通信的例子。

+0

感谢您的详细解释。非常接近我在找的东西。你能解释为什么你比服务器推送更喜欢轮询吗? – Aron

+0

用更多的想法扩大了我的答案。从较高的层面来看,我倾向于因为舒适和熟悉而进行投票。我主要工作在Web应用程序上,这些应用程序适用于请求响应模型。 –

1

听起来就像你问的有关WCF服务的托管选项。共有四个选项:

  1. 自托管在托管应用程序 - 即创建一个控制台应用程序,另一个WPF应用程序等是再创建一个服务,并保持它活着,而它(控制台应用程序)还活着。
  2. 托管的Windows服务 - 创建一个可以由Windows自动启动时
  3. Internet信息服务(IIS)来启动Windows服务 - 同样承载它到ASP.NET服务
  4. Windows进程激活服务(WAS) - 新的激活服务,我没有亲自使用它。

全部细节here

要完全回答你的问题,我不会用ASMX服务。有一个很好的理由,请参阅this question

相关问题