Веб-сервис не обрабатывает несколько одновременных запросов от одного приложения с прокси-классом

У меня есть приложение, которое планирует несколько задач, которые вызывают разные веб-сервисы, некоторые из которых имеют одинаковый веб-сервис, но другой метод. Каждая задача выполняется с интервалом, и каждая задача выполняется в своем собственном потоке. Чтобы получить ссылку на веб-сервис, у меня есть сгенерированный прокси-класс 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 (не клиент)?

Другие вопросы по тегам