#wcf #httpclient #dynamics-crm #fiddler #dynamics-crm-2011
#wcf #httpclient #динамика-crm #скрипач #динамика-crm-2011
Вопрос:
Я использую HttpClient из предварительной версии WCF REST, и мы видим некоторые странные функции, которые я пытаюсь определить.
Что происходит, так это то, что время от времени при выполнении одного из пяти разных вызовов GET для веб-службы RESTful вызов, похоже, вообще не срабатывает, но код, похоже, думает, что он есть. Мы включили трассировку как на стороне службы, так и в окне, отправляющем запрос, и мы не видим исходящих запросов, когда возникает эта проблема. Однако код ожидает весь период ожидания и после этого выдает тайм-аут. Мы провели сотни тестов и видим это только при вызовах GET, а не при вызовах POST, которые также происходят в нашем процессе.
Что еще более интересно, поскольку Fiddler работает на поле, выполняющем запрос, мы вообще не можем воспроизвести проблему. Все запросы каждый раз проходят нормально.
У кого-нибудь есть идеи о том, что может происходить?
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Итак, мы реорганизовали наши вызовы, чтобы просто использовать HttpWebRequest / HttpWebResponse и исключить HttpClient из уравнения, и все еще возникают проблемы. Мы добавили explicit .Операторы Close() для каждого ответа, поэтому не похоже, что мы их не закрываем. Это выполняется в асинхронном плагине Microsoft CRM, поэтому я также отмечаю это, на всякий случай, если это проблема с crm.
Ответ №1:
Поскольку ваш код выполняется на сервере в асинхронном процессе, возможно, на сервере не хватает исходящих TCP-портов. Это довольно распространенное явление, когда у вас есть серверный процесс, взаимодействующий с другими HTTP-серверами.
Вот ссылка, которая описывает проблему немного подробнее и показывает, как обновить реестр на сервере, чтобы оптимизировать эти настройки.
Ответ №2:
Проблема оказалась в том, что соединения не закрывались, а удаленный сервер ограничивал количество подключений к определенному IP-адресу. Оказывается, что код HttpClient создает новое имя ConnectionGroupName для каждого экземпляра, и мы создавали новое имя при каждом вызове. Несмотря на то, что мы завернули вызовы в инструкции using, соединения не закрылись.
Мы переписали код, используя HttpWebRequest / HttpWebResponse повсюду и явно вызывали .Close() при каждом вызове. Это решило проблему.
Мы предполагаем, что все вызовы работали через Fiddler, потому что он либо закрывал, либо объединял соединения для нас
Комментарии:
1. Есть ли какой-либо способ явно задать ConnectionGroupName для каждого запроса для HttpClient или HttpRequestMessage ?