TryReceiveRequest вызывается бесконечное количество раз - PullRequest
0 голосов
/ 11 августа 2009

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

Я заметил, что мой сервис увеличивает загрузку ЦП до 100%, как только первый запрос обрабатывается, и сервис становится все медленнее и медленнее, чем больше поступает запросов. Причину такого поведения можно увидеть после вставки команд регистрации в каждую функцию привязки.

До первого запроса все работает нормально:

ChannelListener: OnBeginAcceptChannel
ChannelListener: OnAcceptChannel

Затем выполняется обработка первого сообщения:

Channel: static constructor
Channel: constructor
ChannelListener: OnEndAcceptChannel (completes)
ChannelListener: Uri get
ChannelListener: OnBeginAcceptChannel
ChannelListener: OnAcceptChannel
Channel: OnOpen
Channel: BeginTryReceiveRequest
Channel: TryReceiveRequest
Channel: WaitForRequest
Channel: ReceiveRequest
Context: constructor
Channel: EndTryReceiveRequest (completes)
Context: RequestMessage get
`Channel: BeginTryReceiveRequest`
Context: Reply noTimeout
Context: Reply
Context: Close noTimeout
`Channel: TryReceiveRequest`
`Channel: WaitForRequest`
`Channel: ReceiveRequest (hangs)`
`Channel: EndTryReceiveRequest (doesn't complete since receive hangs)`
`Channel: BeginTryReceiveRequest`
`and so on...`

Канал реализует интерфейс IReplyChannel, поэтому должна быть возможность только получить запрос, ответить на него и затем закрыть канал. Вместо того, чтобы просто закрывать канал, ServiceModel продолжает рассылать спам TryReceiveRequest на уже используемый канал независимо от того, какой канал уже использовался в прошлом.

Есть ли способ исправить это правильно? Почему ServiceModel не закрывает канал после закрытия контекста ответа, хотя держать канал открытым после его использования бесполезно?

1 Ответ

1 голос
/ 25 декабря 2013

Итак, возможно, кому-то все еще нужно решить эту проблему. Проверьте свойство State канала на BeginTryReceiveRequest и EndTryReceiveRequest .

.....

public IAsyncResult BeginTryReceiveRequest(TimeSpan timeout, AsyncCallback callback, object state)
        {
            if (State == CommunicationState.Closed)
            {
                return null;
            }
            return new TryReceiveRequestAsyncResult(timeout, this, callback, state);
        }

.....

public bool EndTryReceiveRequest(IAsyncResult result, out RequestContext context)
            {
                if (State == CommunicationState.Closed)
                {
                    context = null;
                    return false;
                }
                return TryReceiveRequestAsyncResult.End(result, out context, this);
            }
...