Асинхронный вызов службы WCF завершается молча и случайно - PullRequest
4 голосов
/ 25 января 2012

Я работаю над этой проблемой уже несколько дней и, похоже, не могу найти решение: (

У меня есть асинхронный вызов службы WCF, который иногда будет работать, а в других случаях не будет делать абсолютно ничего - ни вызова, ни ошибки, ничего. Он просто остановится после выполнения моего вызывающего метода (основной поток). Точки останова были добавлены как в метод службы, так и в автоматически сгенерированный прокси-класс. Если я отлаживаю по неудачному вызову, эти контрольные точки никогда не будут достигнуты. В других случаях (когда это работает) все точки останова будут достигнуты.

Я полностью удалил службу и добавил ее снова, но все равно не повезло. Я даже добавил новый метод обслуживания и объект сообщения запроса в надежде, что это была странная проблема с оригиналом, однако я испытываю ту же проблему и с недавно добавленным методом.

Хочу отметить, что эта проблема возникает чаще, когда я публикую свое приложение на виртуальной машине. На моей локальной машине такого не бывает, но все же это происходит.

Вот пример моего кода: -

Это асинхронный вызов службы;

ValidateUpdatesMessageRequest request = new ValidateUpdatesMessageRequest();
_serviceClient.ProcessUpdatesAsync(Request)

Сервисный метод выглядит следующим образом;

public ValidateUpdatesMessageResponse ProcessUpdates(ValidateUpdatesMessageRequest request){ 
//method body 
}

У меня также есть интерфейс для службы, который выглядит следующим образом;

[OperationContract]
ValidateUpdatesMessageResponse ProcessUpdates(ValidateUpdatesMessageRequest request);

Я бы оценил ЛЮБУЮ обратную связь, что могло бы помочь направить меня в сторону решения.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Заранее большое спасибо!

Ответы [ 3 ]

1 голос
/ 26 января 2012

Я действительно решил мою проблему.

Я думал, что опубликую свое решение для всех, кто может столкнуться с той же проблемой.

В конце моего метода, который вызывает асинхронный метод: -

_serviceClient.ProcessUpdatesAsync(request);

У меня было

CleanUp()

который позвонил

_serviceClient.CloseAsync();

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

Я просто взял

CleanUp() 

из оригинального вызова метода к службе и помещает его в метод завершения события, таким образом, асинхронный поток закрывается после завершения Кажется, теперь так очевидно!

Спасибо за все ваши предложения и пожелания, это очень ценится!

1 голос
/ 25 января 2012

Для этого есть 3 основных причины:

  1. Сбои служб и, следовательно, ответ не отправляется.Проверьте журналы на стороне сервера.
  2. В сети возникла проблема, из-за которой звонок не возвращается.Попробуйте отслеживать сетевой трафик с помощью wireshark.
  3. Вызов возвращается, но никто не слушает.Это происходит, когда код, который должен был получить ответ, вышел из области видимости.Сделайте обзор кода, чтобы найти эту проблему.

Надеюсь, это поможет.

0 голосов
/ 20 февраля 2013

Была похожая проблема.В моем случае причиной этого было слишком низкое maxArrayLength значение в readerQuotas привязки.

...