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

Мое приложение WPF вызывает службу WCF с помощью одного клиентского объекта. Это нормально работает, когда запрос отправляется, а ответ приходит непосредственно перед следующим запросом.

Когда я отправляю первый запрос, и требуется 3 минуты, чтобы выполнить расчетную задачу и вернуть результат. Тем временем из моего приложения WPF отправляется второй запрос (запрос ping отправляется каждые 3 секунды). В это время я получаю следующую ошибку, и приложение WPF отключается:

Сервер не предоставил значимого ответа: это могло быть вызвано несоответствием контракта, преждевременным завершением сеанса или внутренней ошибкой сервера.

Коммуникационный объект System.ServiceModel.Channels.ServiceChannel не может использоваться для коммуникации, поскольку он находится в состоянии сбоя.

Мое служебное поведение записывается следующим образом:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, IncludeExceptionDetailInFaults=true)]

Я пробовал другую комбинацию, но она не работает.


person A. Gopal Reddy    schedule 16.07.2018    source источник
comment
Мое приложение WPF вызывает службу WCF с помощью одного клиентского объекта. Думаю, вы только что узнали, что вам нужно это изменить. Создайте по одному звонку.   -  person nvoigt    schedule 16.07.2018
comment
Я пробовал PerCall и режим параллелизма как Multiple. Он бросал при первом подключении к службе WCF. Вы хотите, чтобы я оставил режим параллелизма как одиночный и попробовал еще раз?   -  person A. Gopal Reddy    schedule 16.07.2018
comment
Я имел в виду, что вам нужно создать один экземпляр на стороне клиента для каждого вызова, который вы хотите сделать.   -  person nvoigt    schedule 16.07.2018
comment
Да, это пришло мне в голову. Но проблема в том, что это уже существующее приложение, я добавляю к нему новую функцию. Я не могу изменить везде. Это не разрешено. Кроме того, у него есть обратные вызовы, разные потоки, вызывающие службу WCF (поток ping) и т. Д. Есть ли другой способ?   -  person A. Gopal Reddy    schedule 16.07.2018


Ответы (2)


Если вы выполняете несколько одновременных вызовов из одиночного клиента, вы должны установить ConcurrencyMode в Multiple в дополнение к InstanceContextMode. Обратите внимание, что если вы установите InstanceContextMode в Single, ваша служба будет действовать как singleton. Тогда вы должны знать об управлении переменными, потому что это отражается на других звонки ..

person AmirHossein Fathi    schedule 16.07.2018
comment
Да, у меня есть несколько одновременных вызовов для одного клиента. Также я пробовал InstanceContextMode как Single и ConcurrenyMode как Multiple. Однако я использую только один объект Sevice Client внутри класса ServiceManager для вызова службы. Тем не менее, приложение WPF отключается. - person A. Gopal Reddy; 16.07.2018

Ваш запрос Ping не должен использовать тот же канал. Он должен открыть свой собственный канал. В идеале каждый независимый запрос должен открывать собственный канал (в качестве альтернативы вы можете построить систему очередей). Но доступ к одному и тому же каналу из двух разных потоков не сработает.

person nvoigt    schedule 16.07.2018