Возможно, для кода продукта не существует смысла создавать экземпляры этих типов, но усталость констекторов сделала модульные тесты клиентов, которые используют Http
реализации WebRequest/Response
гораздо больше проблем, чем должно быть. Я не вижу никакой ценности в том, чтобы отвлечь конструкторов и дать им очевидную ценность, так какова техническая причина их устаревания?Почему разработчики HttpWebRequest и HttpWebResponse были удалены из .NET?
ответ
Хм, зачем именно вам нужен конструктор HttpWebRequest
? Я не вижу никаких предпочтений по сравнению с WebRequest.Create
, который предлагается как предпочтительный способ создания таких запросов во всех версиях с самого начала.
Этот метод возвращает HttpWebRequest
как WebRequest
, но вы по-прежнему можете направить его прямому типу для своих нужд. Если вы предоставите некоторые другие протоколы, как file://
или ftp://
, он вернет соответствующие типы.
Я думаю, что этот Obsolete list является частью стандартизации .NET Core для всех платформ, которые он будет использоваться, и будет намного проще поддерживать создание WebRequest
в одной точке кода.
Update:
Я думаю, что вы видели эту статью о deriving the WebRequest
class, так что я просто напишу здесь еще один пакет моего мнения:
Когда вы Деринг из WebRequest
, вам нужно два очка :
- реализовать
IWebRequestCreate
интерфейс - зарегистрировать класс с методом
WebRequest.RegisterPrefix
Как MSDN говорит:
HttpWebRequest
класс зарегистрирован для обслуживания запросов по HTTP и HTTPS схемы по умолчанию. Попытки зарегистрировать другого потомкаWebRequest
для этих схем потерпят неудачу.
Таким образом, Microsoft хочет контролировать http
и https
ориентированных классов и не хотят, чтобы кто-заменить эту функциональность с их собственной. Я думаю, что это может быть сделано из-за некоторых проблем безопасности. Печально, но верно.
'WebRequest.Create' отлично подходит для создания экземпляров объектов запроса и мог быть исключен из вопроса. Проблема заключается в том, что вы пытаетесь наследовать от класса (в частности, «WebResponse») или создавать его для модульного тестирования, и вы не можете этого сделать. Например, если у меня есть метод десериализации, например 'public T DeserializeResponse (HttpWebResponse resp)' Мне нужно использовать непрактичную работу, чтобы проверить это, а не на очевидный make-экземпляр передать метод, утверждать против 'T'. –
evanmcdonnal
@evanmcdonnal Обновлен ответ, но у вас пока нет способа помочь (я думаю, что вопрос рано или поздно будет закрыт как слишком широкий) – VMAtm
Да, все в порядке. Это несколько не соответствует критериям SO, потому что это можно считать субъективным. Спасибо за информацию. Шаги, о которых вы говорите, в результате получения WebRequest - это именно то, что я пытаюсь сделать. Я расстроен тем, что мои способности модульных тестов делают это для «WebResponse», но не «HttpWebResponse». Дело в том, что я тоже пытаюсь использовать другую схему ('test: //'), тогда моя тестовая конфигурация будет иметь этот префикс вместо http для URL-адресов. – evanmcdonnal