Есть ли способ изменить поведение HttpWebRequest для 400/500 кодов состояния?

#httpwebrequest #webexception #custom-error-handling

#httpwebrequest #webexception #пользовательская обработка ошибок

Вопрос:

Я работаю над созданием свободного клиентского интерфейса REST поверх HttpWebRequest / HttpWebResponse типов в .NET. Пока все хорошо … однако я пытаюсь разработать подключаемую платформу безопасности, которая может автоматически обрабатывать согласование токена безопасности, обновление токена и т.д.

Я столкнулся с проблемой из-за характера того, как HttpWebRequest/Response работают, когда они сталкиваются с кодом состояния HTTP серии 400 или 500. Вместо того, чтобы просто устанавливать свойства .StatusCode и .StatusDescription и позволять вам обрабатывать их любым способом, который вы пожелаете, они выдают WebException . Вообще говоря, это, вероятно, не проблема … однако способ аутентификации (производный от OAuth 2.0), мне нужно обрабатывать определенные ошибки серии 400 без возникновения исключения.

Есть ли какой-нибудь способ перенастроить HttpWebRequest / Response, чтобы НЕ выдавать ошибку WebException , и позволить потребителю определять собственную обработку ошибок? Я знаю, что есть несколько обходных способов обработки ожидаемого продолжения на старых серверах Http1.0…Мне любопытно, существует ли аналогичный обходной способ отключения WebExceptions.

(О, и просто не могу удержаться … БОЛЬШОЕ СПАСИБО моим ЗАМЕЧАТЕЛЬНЫМ друзьям в RedGate за незаконное изъятие бесплатной версии Reflector 6 с привязкой к лицензии … Я мог бы разобраться с этим самостоятельно, если бы смог просмотреть код … но увы…К сожалению, отражатель теперь нежизнеспособен, поскольку он израсходовал себя с помощью автолиза. ;P )

Комментарии:

1. Что касается Reflector, попробуйте использовать ILSpy.

Ответ №1:

У меня была похожая проблема, и я решил ее с помощью следующего вспомогательного метода:

 public static HttpWebResponse MakeRequest(HttpWebRequest request)
{
    try
    {
        return (HttpWebResponse)request.GetResponse();
    }
    catch (WebException we)
    {
        if (we.Response != null)
        {
            return (HttpWebResponse)we.Response;
        }
        throw;
    }
}
  

Комментарии:

1. Спасибо за ответ. В итоге я сделал практически то же самое. Я не уверен, почему Microsoft решила заставить пользователей перехватывать исключение в случае кода состояния типа ошибки … но это действительно усложняет ситуацию. Хороший маленький помощник… однако можно попробовать сделать это методом расширения в HttpWebRequest… упрощает использование. 😉