HttpRequest vs HttpRequestMessage vs HttpRequestBase
Каковы различия между этими классами в ASP.NET? Поскольку я обнаружил, что между этими классами нет отношения наследования.
Ниже код возвращает экземпляр HttpRequestWrapper
, который is a
HttpRequestBase
и has a
HttpRequest
HttpRequestMessage request = ...;
HttpRequestBase reqBase = (request.Properties["MS_HttpContext"] as HttpContextWrapper).Request;
// do somthing with reqBase.Cookies
Похоже, Microsoft захотела нас раздражать, пытаясь найти куки из HttpRequestMessage.
Гарантировано ли, что request.Properties["MS_HttpContext"]
никогда не будет null?
Или подумайте, что запрос ajax обрабатывается в действии ApiController. Я могу достичь IP-адреса клиента двумя разными способами.
var ip = (request.Properties["MS_HttpContext"] as HttpContextWrapper).Request.UserHostAddress
var ip = HttpContext.Current.Request.UserHostAddress
В чем разница между этими двумя?
Или, в общем, я могу получить доступ к таким же данным запроса/ответа, как Cookie, Header, Requestor Info и т.д. по-разному. Когда использовать какой? Можем ли мы сказать что-то вроде "если это запрос ajax, HttpRequest не гарантированно работает должным образом из-за отсутствия чего-либо для запросов ajax, мы должны вместо этого использовать HttpRequestMessage"?
Ответы
Ответ 1
HttpRequest присутствует на Page и UserControl как свойство GET. Аналогично, большинство его свойств также GET-only (см. 1). Этот класс используется страницами ASP.NET для получения информации о входящем HTTP-запросе, например. читать IP-адрес клиента, файлы cookie, строку запроса, еще что-то. Важно отметить, что это часть "старой" сборки System.Web, которая существует с .NET 1.1
HttpRequestMessage, с другой стороны, является новым в .NET 4.5. Это часть System.Net. Он может использоваться как клиентами, так и службами для создания, отправки и получения запросов и ответов по HTTP. Он заменяет HttpWebRequest, который устарел в .NET 4.5
В HttpRequestBase и HttpRequestWrapper, лучше всего я могу просто указать docs
Класс HttpRequestWrapper происходит от класса HttpRequestBase и служит в качестве оболочки для класса HttpRequest. Этот класс предоставляет функциональность класса HttpRequest и раскрывает Тип HttpRequestBase. Класс HttpRequestBase позволяет вам заменить первоначальная реализация класса HttpRequest в вашем приложение с пользовательской реализацией, например, когда вы выполняете модульное тестирование вне конвейера ASP.NET.