Класс System.NET.HttpWebRequest создает различные WebExceptionStatus для SSL и не-SSL-запросов в особых условиях

Переводы статьи Переводы статьи
Закрыть Закрыть
Код статьи: 2007873 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Проблема

При использовании класса System.Net.HttpWebRequest.NET framework для отправки запроса HTTP или HTTPS к серверу. Этот запрос занимает некоторое время, чтобы получить ответ от сервера. В это время ожидания вручную увеличения системного времени или отстает от системных часов, а затем служба времени Windows настраивает фактические местное время возникает одна из следующих:

-Для запроса, который был отправлен по сравнению с использованием обычного текста HTTP класс System.Net.HttpWebRequest выдаст следующее исключение:

Запрос был прерван: Истекло время ожидания операции.

Кроме того свойство Status для созданного класса WebException будет указывать значение WebExceptionStatus.Timeout.

-Для запроса, который был отправлен по протоколу HTTPS создает класс System.Net.HttpWebRequest одно из следующих исключений:

Базовое соединение закрыто: непредвиденная ошибка при приеме.

Кроме того свойство Status для созданного класса WebException будет указывать значение WebExceptionStatus.ReceiveFailure.

OR

Базовое соединение закрыто: подключение, которое ожидается активных был закрыт сервером.

Кроме того свойство Status для созданного класса WebException будет указывать значение WebExceptionStatus.KeepAliveFailure.

Во всех указанных выше сценариев класса WebException, которое перехватывается имеет свойство InnerException. Если перехвата класса WebException и ссылки на свойство WebException.InnerException.InnerException можно заметить, что во всех случаях выше в сообщении будет указано: «подключения не удалась, поскольку подключенных сторона не ответила правильно после определенного периода времени или разорвано уже установленное соединение потому что подключенный узел не отвечает». Это сообщение является Интерпретация подробный код ошибки Winsock 10060 = WSAETIMEDOUT.

Таким образом при системного времени вручную увеличивается, winsock правильно выдаст ошибку времени ожидания 10060, но он получает обтекать как отдельное исключение типов для SSL и не-SSL-запросов.

Обстоятельствах обычное время ожидания где системного времени не подделаны, SSL и не-SSL-сценарии правильно будет отражать состояние WebExceptionStatus.Timeout и общие исключения: «операции истекло».

Причина

При выполнении запроса через SSL и не-SSL-класс System.Net.ServicePointManager присвоит запрос для внутреннего соединения, которое в конечном счете будет производить подключение winsock.  В случае использования SSL-запросы на данный запрос на подключение проходит через другой внутренний класс SSL/TLS для шифрования и расшифровки данных, отвечающий. Для не-SSL-соединений это внутренний класс SSL/TLS не участвует вообще.

При изменении времени и исключение встречается на уровне winsock, эта ошибка должна теперь передаются вверх из winsock для уровня приложения. Для не-SSL-подключений данное исключение перехватывается классом внутреннего соединения, но запросы SSL, эта ошибка обрабатывается внутренний класс SSL/TLS. Этот класс считает, что эта ошибка «не-SSL-» как ReceiveFailure и KeepAliveFailure и поэтому имеет статус различных исключений, в то время как для не-SSL-подключения ошибку получает приведение правильно, так как она обрабатывается другой класс.

Данное поведение является особенностью.

Решение

Для устранения этого несоответствия типов исключение под это особое состояние, где подделан системное время, приложению для перехвата класса WebException и затем сослаться на свойство WebException.InnerException.InnerException.Message.

Если строка сообщения равняется winsock на подробных сведений об эквивалентных 10060 = WSAETIMEDOUT, а затем рассмотрим ReceiveFailure / KeepAliveFailure, как обычные тайм-аут и рассматривает его как ReceiveFailure и KeepAliveFailure.

Приложение может использовать ниже метод обхода при выполнении catch() класса WebException для английской версии платформы. Необходимо отметить, что для локализованной версии платформы, ниже метод обхода необходимо скорректировать в зависимости от языка локализации.

Внимание: этот пример кода предоставляется как-предназначен только для примера и.  Он поставляется без гарантий и предоставляет права отсутствуют.

Попробуйте {
........
........
}
catch (класса WebException oWEx)
{
WebExceptionStatus oStatus = oWEx.Status;
Строка strTimeoutErrorMessage = «подключения не удалась, поскольку подключенных сторона не ответила правильно после определенного периода времени или разорвано уже установленное соединение потому что подключенный узел не отвечает»;

коммутатор (oStatus)
{
случай WebExceptionStatus.KeepAliveFailure:
Если ((oWEx.InnerException! = null)
& & (oWEx.InnerException.InnerException! = null)
& & oWEx.InnerException.InnerException.Message.ToString().Знак равенства (strTimeoutErrorMessage, StringComparison.CurrentCultureIgnoreCase))
{
//----------------------------------------------------------------------
/ / Это ошибка времени ожидания, который неправильно выводится как ReceiveFailure для
/ / SSL запросов под это особое состояние.
//
/ / Обработать это как ошибку времени ожидания
//----------------------------------------------------------------------


} else {
//----------------------------------------------------------------------
/ / Это действительно KeepAliveFailure.
//----------------------------------------------------------------------
}

Разрыв;
случай WebExceptionStatus.Timeout:
//----------------------------------------------------------------------
/ / Это время ожидания.
//----------------------------------------------------------------------
Разрыв;
случай WebExceptionStatus.ReceiveFailure:

BR > Если ((oWEx.InnerException! = null)
& & (oWEx.InnerException.InnerException! = null)
& & oWEx.InnerException.InnerException.Message.ToString().Знак равенства (strTimeoutErrorMessage, StringComparison.CurrentCultureIgnoreCase))
{
//----------------------------------------------------------------------
/ / Это ошибка времени ожидания, который неправильно выводится как ReceiveFailure для
/ / SSL запросов под это особое состояние.
//
/ / Обработать это как ошибку времени ожидания
//----------------------------------------------------------------------


} else {
//----------------------------------------------------------------------
/ / Это действительно ReceiveFailure.
//----------------------------------------------------------------------
}
Разрыв;
по умолчанию:
Примечание. Это ЭКСПРЕСС-ПУБЛИКАЦИЯ, подготовленная непосредственно службой технической поддержки Майкрософт . Сведения, содержащиеся в данном документе, предоставлены в качестве отклика на возникшие проблемы. Из-за срочности в материалах могут быть опечатки, и в любое время и без уведомления в них могут быть внесены изменения. Чтобы получить дополнительные сведения, см. Условия использования.

Свойства

Код статьи: 2007873 - Последний отзыв: 30 мая 2011 г. - Revision: 15.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft .NET Framework 3.5 Service Pack 1
Ключевые слова: 
kbmt KB2007873 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:2007873

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com