1

我有 ac# WCF Web 服务,它是一个服务器,我有 2 个客户端,一个是 java 客户端,另一个是 c++ 客户端。我希望两个客户端同时运行。我有并且无法弄清楚的情况是:

我的 java 客户端将调用 WCF Web 服务,处理时间可能需要大约 10 分钟,同时我希望我的 c++ 客户端调用 Web 服务并获取响应。但是现在我只能在处理 java 客户端请求时使用 c++ 客户端调用 Web 服务。在 Java 客户端请求完成之前,我没有收到 C++ 客户端请求的响应。

任何人都可以建议我如何使这项工作并行。提前致谢。

4

3 回答 3

2

任何“正常”的 WCF 服务都绝对可以在任何给定时间处理多个客户端请求。

这完全取决于您的设置InstanceContextMode

  • PerSession意味着,每个会话都获取服务类的副本来处理多个请求(来自同一个客户端)

  • PerCall意味着,每个请求都会获得服务类的新副本来处理请求(并且在处理调用后再次处理它)

  • 单身意味着,你有一个单身 - 只是你的服务类的一个副本。

如果你有一个单身人士 - 你需要问自己:为什么?默认情况下,PerCall这是推荐的设置,它应该很容易同时支持很多请求。

有关更详尽的说明,请参阅了解实例上下文模式。

于 2012-06-20T19:44:25.270 回答
1

采用

[ServiceBehavior( ConcurrencyMode = ConcurrencyMode.Multiple )]

服务类的属性。更多关于这个的例子在这里:

http://www.codeproject.com/Articles/89858/WCF-Concurrency-Single-Multiple-and-Reentrant-and

于 2012-06-20T19:42:54.087 回答
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 调用都必须是异步的,但对于其他客户端,此限制不存在)。

这是一篇 codeproject 文章,详细演示了一种略有不同的方式。 http://www.codeproject.com/Articles/91528/How-to-Call-WCF-Services-Synchronously-and-Asynchr

这可以防止客户端在 10 多分钟的过程中阻塞,但并没有真正改变服务本身的运行方式。

Now the second part of what I was mentioning was firing off the 10+ minute process in a separate thread from inside the service. The service methods themselves should be very thin and just be calling functionality in other libraries. Functions that are going to take a long time should ideally be called in their own threads (say a backgroundworker, for which you register on the service side a callback when it completes) and have some sort of persistent system to keep track of their progress and any results that need to go back to the client. If it were me I would register the request for the process in a db and then update that db with its completion. The client would then periodically initiate a simple poll to see if the process was completed and get any results. You might be able to set up duplex binding to get notified when the process completes automatically but to be honest it's been a few years since I've done any duplex binding so I don't remember exactly how it works.

These topics are really too big for me to go into depth here. I would suggest researching multithreaded operations with the BackgroundWorker.

于 2012-06-20T20:27:15.807 回答