Веб-сервис не обрабатывает несколько одновременных запросов от одного приложения с прокси-классом
У меня есть приложение, которое планирует несколько задач, которые вызывают разные веб-сервисы, некоторые из которых имеют одинаковый веб-сервис, но другой метод. Каждая задача выполняется с интервалом, и каждая задача выполняется в своем собственном потоке. Чтобы получить ссылку на веб-сервис, у меня есть сгенерированный прокси-класс wsdl.exe, который создается внутри каждой из задач и всегда располагается. Однако при запуске приложения задачи фактически ожидают друг друга при запросах на обслуживание, веб-служба не обрабатывает запрос на обслуживание от задачи y до того, как его запрос на обработку завершен из задачи x (я вижу это, поскольку вызов службы из задачи x может занять 5 минут и задача y 100 миллисекунд, однако, если y запускается, когда x работает, он завершается через 100 миллисекунд после x).
Это код из задачи (работающий внутри собственного потока):
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. Я не внес никаких изменений в конфигурацию службы wcf, созданной в visual studio 2008.
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
1 ответ
Вероятно, это связано с настройками параллелизма / создания экземпляров в вашей службе WCF.
Если все ваши звонки идут на один и тот же экземпляр службы (например, InstanceContextMode = PerSession or Single
), то обычно вам нужно убедиться, что вы установили ConcurrencyMode
в Multiple
в противном случае вызовы обслуживаются в последовательном порядке.
Можете ли вы рассказать нам больше о том, как настраивается служба WCF (не клиент)?