以下是规范:
另一个要求是让客户取消他们之前做过的请求。请注意,我们不必担心向管道发送过多数据,我们只发送确认特定模拟运行完成(或失败)
首先,我想我可以使用单个asmx Web服务完成所有这些工作,但现在我认为这可能很难处理。 WCF似乎是另一种选择,但我不熟悉它,它似乎比我需要的功能复杂得多。
有什么想法吗?
答案 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服务。它具有很强的可扩展性。唯一的问题是它需要一段时间才能“获得”它,但是一旦你真的那么简单。祝你好运。