如何在.NET中构建此客户端/服务器应用程序?

时间:2012-10-12 16:01:20

标签: .net wcf architecture client-server

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

目前我们正在考虑如何构建这样一个工具,看起来我们错过了一些关键的难题。

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

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

我们遇到的主要问题是

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

如果有更改,如何将进度更新从服务器推送到WPF客户端?

我们正在尝试研究如何做到这一点,但没有找到与该主题相关的任何内容。任何指向文章/指导的指针都会有很大的帮助。

2 个答案:

答案 0 :(得分:3)

您遇到的困惑在于假设作业和WCF端点的执行是相同的。我将其分为三个主要项目:

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

    客户端应用程序应通过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 Exeter在运行作业时发布消息,并且客户端应用程序需要接收这些消息(可能是MSMQ,Service Bus Implementation,BizTalk等)。

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

    现在我考虑过这种情况可能会出现我会推送风格的情况,以及我调查的情况。

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

    如果客户在内部并且您需要向他们传输实时信息,那么推模型会更有意义。在这种情况下,您可以将客户端连接到服务器应用程序,他们可以通过连接来回发送消息(我没有亲自完成此操作,所以我没有建议如何设置,希望比套接字更高级别的东西)。

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

答案 1 :(得分:1)

听起来您在询问WCF服务的托管选项。有四种选择:

  1. 托管应用程序中的自托管 - 即创建一个控制台应用程序,另一个WPF应用程序等,然后创建一个服务并在它(控制台应用程序)处于活动状态时保持活动状态。
  2. 托管Windows服务 - 创建可在Windows启动时自动启动的Windows服务
  3. Internet信息服务(IIS) - 与ASP.NET服务类似地托管它
  4. Windows进程激活服务(WAS) - 新的激活服务,我没有亲自使用它。
  5. 完整详情here

    要完全回答您的问题,我不会使用ASMX服务。有关原因的详细信息,请参阅this question