Подтвердить что ты не робот

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"?

4b9b3361

Ответ 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.