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