web-dev-qa-db-fra.com

HttpRequest vs HttpRequestMessage vs HttpRequestBase

Quelles sont les différences entre ces classes dans ASP.NET? Comme je l'ai découvert, il n'y a pas de relation d'héritage entre ces classes.

Le code ci-dessous renvoie une instance de HttpRequestWrapper qui is aHttpRequestBase et has aHttpRequest

HttpRequestMessage request = ...;
HttpRequestBase reqBase = (request.Properties["MS_HttpContext"] as HttpContextWrapper).Request;
// do somthing with reqBase.Cookies

Il semble que Microsoft voulait nous ennuyer en atteignant les cookies de HttpRequestMessage.

Est-il garanti que request.Properties["MS_HttpContext"] ne sera jamais nul?

Ou pensez qu'une requête ajax est traitée dans une action d'ApiController. Je peux atteindre l'IP du client de deux manières différentes.

var ip = (request.Properties["MS_HttpContext"] as HttpContextWrapper).Request.UserHostAddress

var ip = HttpContext.Current.Request.UserHostAddress

Quelle est la différence entre ces deux?

Ou en général, je peux accéder aux mêmes données de demande/réponse telles que les cookies, l'en-tête, les informations du demandeur, etc. de différentes manières. Quand utiliser quoi? Pouvons-nous dire quelque chose comme "s'il s'agit d'une demande ajax, HttpRequest n'est pas garanti de fonctionner correctement en raison du manque de quelque chose, donc pour les demandes ajax, nous devrions utiliser HttpRequestMessage à la place"?

48
Mehmet Ataş

HttpRequest est présent sur les classes Page et serControl en tant que propriété GET uniquement. De même, la plupart de ses propres propriétés sont également GET uniquement (voir 1 ). Cette classe est utilisée par les pages ASP.NET pour obtenir des informations sur la demande http entrante, par exemple lire l'adresse IP du client, les cookies, la chaîne de requête, etc. Plus important encore, il fait partie de l '"ancien" assembly System.Web, qui existe depuis .NET 1.1

HttpRequestMessage , d'autre part, est nouveau dans .NET 4.5. Il fait partie de System.Net . Il peut être utilisé à la fois par les clients et les services pour créer, envoyer et recevoir des demandes et des réponses via HTTP. Il remplace HttpWebRequest , qui est obsolète dans .NET 4.5

Sur HttpRequestBase et HttpRequestWrapper, le mieux que je puisse faire est de simplement citer le docs

La classe HttpRequestWrapper dérive de la classe HttpRequestBase et sert de wrapper pour la classe HttpRequest. Cette classe expose les fonctionnalités de la classe HttpRequest et expose le type HttpRequestBase. La classe HttpRequestBase vous permet de remplacer l'implémentation d'origine de la classe HttpRequest dans votre application par une implémentation personnalisée, par exemple lorsque vous effectuez des tests unitaires en dehors du pipeline ASP.NET.

43
Filip