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

标签 .net wcf architecture client-server

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center寻求指导。




9年前关闭。




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

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

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

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

我们的主要问题是

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

发生更改时如何将进度更新从服务器推送到 WPF 客户端?

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

最佳答案

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

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

  • 客户申请

    客户端应用程序应通过 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 等)。

    为什么我更喜欢轮询而不是服务器推送

    现在我想起来了,我可能会在某些情况下使用 push 风格,而在某些情况下我会进行投票。

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

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

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

    关于.net - 如何在 .NET 中构建此客户端/服务器应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12862967/

    相关文章:

    c# - 如何仅在需要时提升权限?

    c# - 设置WebView2的缓存目录

    c# - 序列化数据成员(名称)覆盖问题

    wcf - 如何使用流?将流转换为我从客户端接收到的字节

    c# - WCF:序列化和反序列化泛型集合

    .net - MVC/MVP/MVVM - 如何组织业务逻辑

    .net - .NET 的简单事件总线

    c# - 检测/诊断线程饥饿

    java - JMS 如何与服务总线相关

    java - 将本地软件转换为在线软件