我有一个c#WCF Web服务,它是一个服务器,我有2个客户端,一个是java客户端,另一个是c ++客户端。我希望两个客户端同时运行。我所拥有的并且无法弄明白的情况是:
我的java客户端将调用WCF Web服务,处理时间可能大约需要10分钟,同时我希望我的c ++客户端调用Web服务并获取响应。但是现在我只能在处理java客户端请求时使用c ++客户端调用Web服务。在java客户端请求完成之前,我没有得到c ++客户端请求的响应。
任何人都可以建议我如何使这项工作平行。提前谢谢。
答案 0 :(得分:2)
任何“普通”WCF服务在任何给定时间都可以绝对处理多个客户端请求。
这完全取决于InstanceContextMode
的设置:
PerSession 表示每个会话获取服务类的副本以处理大量请求(来自同一客户端)
PerCall 表示每个请求获取服务类的新副本以处理请求(并在处理完呼叫后再次处理)
单个表示您有一个单身人士 - 只是服务类的一个副本。
如果您有单身人士 - 您需要问问自己:为什么?默认情况下,PerCall
是推荐设置,这应该可以轻松支持多个请求。< / p>
有关详细说明,请参阅Understanding Instance Context Mode。
答案 1 :(得分:1)
使用
[ServiceBehavior( ConcurrencyMode = ConcurrencyMode.Multiple )]
属于您的服务类。更多相关信息,例如:
http://www.codeproject.com/Articles/89858/WCF-Concurrency-Single-Multiple-and-Reentrant-and
答案 2 :(得分:1)
这是您的问题的外围设备,但您是否考虑过该方法需要10多分钟才能返回的异步回调,然后让该进程在一个单独的线程中运行?让服务呼叫同步等待10分钟并不是一个好的做法,并且可以解决您的问题,尽管该服务应该允许同时有多个呼叫者(我们的WCF服务需要数千个同时请求)。
当您调用WCF时,您可以选择同步或异步调用它。同步调用等待响应在同一操作中发送回调用方。在调用者中它看起来像“myresult = svc.DoSomething()”。通过异步调用,调用者为服务提供在完成时调用但不等待响应的函数。呼叫者在等待响应时不会阻塞并继续其业务。
您的回调将采用DoSomethingCompletedEventArgs: void myCallback(object sender,DoSomethingCompletedEventArgs e) { var myResult = e.Result; //然后使用你以前的结果。 }
您将回调函数注册为事件处理程序: svc.DoSomethingCompleted + = myCallBack函数; 然后 svc.DoSomethingAsync()。请注意,该语句中没有返回值;该服务在完成并传递结果时将执行myCallBack。 (来自Silverlight的所有WCF调用必须是异步的,但对于其他客户端,此限制不存在)。
这是一篇代码项目文章,详细介绍了一种略有不同的方式。 http://www.codeproject.com/Articles/91528/How-to-Call-WCF-Services-Synchronously-and-Asynchr
这可以防止客户端在10分钟的过程中阻塞,但并没有真正改变服务本身的运行方式。
现在,我提到的第二部分是在服务内部的一个单独的线程中解雇10多分钟的进程。服务方法本身应该非常薄,只需要调用其他库中的功能。理想情况下,需要花费很长时间的函数应该在它们自己的线程中调用(比如一个后台工作者,当你完成时在服务端注册一个回调)并且有一些持久的系统来跟踪他们的进度和任何需要返回客户端的结果。如果是我,我会在数据库中注册该进程的请求,然后在完成时更新该数据库。然后,客户端将定期发起一个简单的轮询,以查看该过程是否已完成并获得任何结果。您可能能够设置双工绑定以在过程自动完成时收到通知,但说实话,自从我完成任何双工绑定以来已经过了几年,所以我不记得它是如何工作的。
这些主题对我来说真的太大了,无法深入探讨。我建议使用BackgroundWorker研究多线程操作。