.NET使用外部应用程序实现客户端/服务器排队模型的最佳方法?

时间:2009-02-09 00:47:36

标签: .net web-services request-queueing

以下是规范:

  1. 在本地计算机上使用WPF winforms应用程序的多个客户端
  2. 客户端向服务器发起请求以执行模拟。这个启动可能应该通过Web服务,但欢迎其他建议
  3. 请求在服务器上排队
  4. 服务器通过Web服务向模拟模型发送顺序请求。
  5. 服务器通知客户端模拟已完成
  6. 另一个要求是让客户取消他们之前做过的请求。请注意,我们不必担心向管道发送过多数据,我们只发送确认特定模拟运行完成(或失败)

    首先,我想我可以使用单个asmx Web服务完成所有这些工作,但现在我认为这可能很难处理。 WCF似乎是另一种选择,但我不熟悉它,它似乎比我需要的功能复杂得多。

    有什么想法吗?

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

  

WCF看起来像另一个   选项,但我不熟悉它   它看起来要复杂得多   我需要的功能。

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

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

你应该仔细看看WCF。我已经为工作编写了一个自定义库来处理一些奇怪的配置,但你可以用WCF在几十行代码中编写一个优秀的web服务。它具有很强的可扩展性。唯一的问题是它需要一段时间才能“获得”它,但是一旦你真的那么简单。祝你好运。