2013-03-30 16 views
39

Jakie są różnice między tymi klasami w ASP.NET? Jak odkryłem, nie ma związku spadkowego między tymi klasami.HttpRequest vs HttpRequestMessage vs HttpRequestBase

poniższy kod zwraca instancję HttpRequestWrapper który is aHttpRequestBase i has aHttpRequest

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

Wydaje się, że Microsoft chce drażnić nas podczas dotarcia cookies z HttpRequestMessage.

Czy zagwarantowane jest, że request.Properties["MS_HttpContext"] nigdy nie będzie mieć wartości NULL?

Albo myśl, że żądanie ajax jest obsługiwane w akcji ApiController. Mogę dotrzeć do adresu IP klienta na dwa różne sposoby.

Jaka jest różnica między tymi dwoma?

Generalnie, mogę uzyskać dostęp do tych samych danych dotyczących żądań/odpowiedzi, takich jak plik cookie, nagłówek, informacje o żądającym itp. Na różne sposoby. Kiedy użyć? Czy możemy powiedzieć coś w stylu "jeśli jest to żądanie ajax, HttpRequest nie jest gwarantowane, że działa poprawnie z powodu braku czegoś, więc dla zapytania ajax powinniśmy zamiast tego używać HttpRequestMessage"?

Odpowiedz

35

HttpRequest występuje na klasach Page i UserControl jako własność GET-only. Podobnie większość jego własnych właściwości jest również dostępna tylko w trybie GET (patrz 1). Ta klasa jest używana przez strony ASP.NET w celu uzyskania informacji o przychodzącym żądaniu http, np. odczytać adres IP klienta, pliki cookie, ciąg kwerendy, cokolwiek. Co ważne, jest to część "starego" zestawu System.Web, który istnieje od .NET 1.1

, z drugiej strony, jest nowością w .NET 4.5. Jest częścią System.Net. Może być używany zarówno przez klientów, jak i usługi do tworzenia, wysyłania i odbierania żądań i odpowiedzi za pośrednictwem protokołu HTTP. Zastępuje ono HttpWebRequest, który jest przestarzały w .NET 4.5

Na HttpRequestBase i HttpRequestWrapper, najlepsze, co mogę zrobić, to po prostu przytoczyć docs

Klasa HttpRequestWrapper wywodzi się z klasy HttpRequestBase i służy jako owijki dla klasy HttpRequest. Klasa ta udostępnia funkcjonalność klasy HttpRequest i udostępnia typ HttpRequestBase . Klasa HttpRequestBase umożliwia zastąpienie oryginalnej implementacji klasy HttpRequest w aplikacji za pomocą niestandardowej implementacji, na przykład podczas wykonywania testów jednostkowych poza potokiem ASP.NET.

+3

Dodatkowe informacje na HttpRequest i HttpRequestBase: Większość metod na HttpRequestBase są wirtualne, co sprawia, że ​​typ łatwy wyśmiewać i pośredniczący w ramach testów jednostkowych. – leojh

+0

Czy można znaleźć oficjalne odniesienie do HttpWebRequest jest przestarzałe? Widzę tylko, że konstruktor jest wymieniony jako przestarzały, a dokumentacja wskazuje na to, że WebRequest.Create zamiast tego naprawdę nie jest zgodny z – NStuke

+0

@NStuke, ale wydaje się, że jest to zgoda: http: // stackoverflow.com/questions/18203835/httpwebrequest-in-c-sharp-do-not-work-with-net-4-5 – Filip