3

这是规格:

  1. 多个客户端在其本地计算机上使用 WPF winforms 应用程序
  2. 客户端向服务器发起请求以执行模拟。此启动可能应通过 Web 服务进行,但欢迎提出其他建议
  3. 请求在服务器上排队
  4. 服务器通过 Web 服务向仿真模型发送顺序请求。
  5. 服务器通知客户端模拟完成

另一个要求是让客户取消他们之前提出的请求。请注意,我们不必担心通过管道发送太多数据,我们只发送特定模拟运行完成(或失败)的确认

一开始我认为我可以用一个 asmx Web 服务来完成所有这些,但现在我认为这可能很笨拙。WCF 似乎是另一种选择,但我并不熟悉它,而且它似乎比我需要的功能复杂得多。

有任何想法吗?

4

4 回答 4

2

客户端:要获得完成通知,您需要在从客户端调用 Web 服务时使用异步设计模式。如果您使用“添加 Web 引用”来创建客户端代理,则会为您生成异步模式方法。请参阅:“在 .NET 设计模式中异步访问 Web 服务”。

服务器: 一个普通的 .Net 2.0 asmx Web 服务可以将传入调用排队,以便在服务器上进行串行处理。您可以使用 BackgroundWorker 类构建一个简单的调度程序。调度程序接收每个传入请求并将其分配给后台线程。要序列化线程,请让 worker 方法在模拟调用周围放置一个锁。请参阅使用 BackgroundWorker 线程的示例

Cancellation:要处理取消,让服务器返回一个唯一的 id 及其对客户端请求的响应,并将 id 和关联的后台工作人员引用插入字典。Web 服务上的 CancelSimulation 方法接受 id,在字典中查找 BackgroundWorker 引用并调用其 CancelAsync 方法。任务完成或取消时删除字典条目。字典需要由所有 Web 服务调用共享,因此它应该是静态/共享的。幸运的是,静态字典是线程安全的。

于 2009-02-09T02:12:04.017 回答
1

WCF 似乎是另一种选择,但我并不熟悉它,而且它似乎比我需要的功能复杂得多。

我强烈建议你好好看看 WCF - 是的,一开始它可能有点令人生畏,但它通过配置为你提供了很大的灵活性,而不必编写特定的传输介质(例如 Web 服务与消息队列)。

既然您明确表示客户端会将请求发送到服务器上的队列 - 为什么不首先使用 MSMQ 等基于队列的消息传递系统?

使用服务器和客户端上的 WCF,您可以在使用 MSMQ 与使用“常规”HTTP SOAP 调用与使用例如 REST 调用之间快速切换 - 所有这些都在配置中。恕我直言,这种灵活性值得花一些时间来学习它。

于 2009-02-09T06:24:05.563 回答
1

你应该看看WCF。使用 Web 服务 + 轮询可能会杀死您的服务器(除非您没有那么多客户端) - 只需查看 Twitter。WCF 有一个持久连接,应该非常适合您。

至于排队,添加 System.Messaging 作为参考,使用 MSMQ。我不记得是否有用于 WCF 的 MSMQ 传输,但我相信您可以找到一个。使用它会用一块石头杀死两只鸟。如果您想使用 MSMQ,您的服务器将需要位于 Windows 域中。

否则,我强烈建议您将事件写入数据库,并在工作线程完成时从那里取出它们。将它们保存在内存队列中并不是很容错。

于 2009-02-09T08:13:36.487 回答
0

您应该更仔细地查看 WCF。我已经为工作编写了一个自定义库来处理一些奇怪的配置内容,但是您可以使用 WCF 用几十行代码编写一个出色的 Web 服务。它是高度可扩展的。唯一的问题是“得到”它需要一段时间,但一旦你做到了,它真的非常简单。祝你好运。

于 2009-02-09T01:33:12.033 回答