我有一个应用程序调度多个调用不同网络服务的任务,一些相同的网络服务但不同的方法。每个任务都在一个时间间隔内执行,并且每个任务都在自己的线程中运行。为了获得对 web 服务的引用,我有一个 wsdl.exe 生成的代理类,它在每个任务中实例化并始终被释放。然而,当运行应用程序时,任务实际上在等待服务请求,Web 服务在完成任务 x 的处理请求之前不会处理任务 y 的服务请求(我可以看到这一点,因为来自任务 x 的服务调用可能需要5 分钟,任务 y 100 毫秒,但是如果 y 在 x 运行时开始,则它在 x 完成后 100 毫秒结束。
这是来自任务的代码(在其自己的线程内运行):
public class TaskX : TaskWrapper
{
public TaskX(Guid id, string name, EventQueue eventqueue)
: base(id, name, eventqueue)
{
}
protected override void DoTask()
{
try
{
var factory = new ServiceReferenceFactory();
using (var reference = factory.GetServiceReference())
{
bool result;
bool isSpecified;
reference.Run(out result, out isSpecified);
}
}
}
}
这是来自上述工厂方法的代码:
public ProxyClassService GetServiceReference()
{
var refer = new ProxyClassServiceNamespace.ProxyClassService();
refer.Timeout = 1000 * 60 * 60;
return refer;
}
有谁知道我为什么会遇到这种行为?
编辑:
这是我将 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 添加到我的 wcf 服务的实现后来自任务的一些日志。我没有对在 visual studio 2008 中创建的 wcf 服务进行任何配置更改。
15:02 - 任务开始:TaskXWithInternalException
15:02 - 任务开始:TaskYQuickOne
15:02 - 任务结束:TaskYQuickOne 任务运行时间:00:00:00.1214762
15:02 - 任务开始:TaskZSlowOne
15:03 - 任务开始:TaskXWithInternalException
15:03 - 任务开始:TaskYQuickOne
15:05 - 任务结束:TaskZSlowOne 任务运行时间:00:03:11.6510947
15:05 - 任务结束:TaskYQuickOne 任务运行时间:00:02:09.7311905
15:06 - 任务开始:TaskYQuickOne
15:06 - 任务结束:TaskYQuickOne 任务运行时间:00:00:00.0546980
最佳答案
这可能与 concurrency/instancing settings 有关在您的 WCF 服务上。
如果您的所有调用都转到同一个服务实例(例如 InstanceContextMode = PerSession 或 Single
),那么通常您需要确保已设置 ConcurrencyMode
为 Multiple
,否则将以序列化方式为调用提供服务。
您能告诉我们更多关于 WCF 服务(不是客户端)是如何设置的吗?
关于c# - Web 服务不处理来自具有代理类的同一应用程序的多个同时请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5990469/