web-dev-qa-db-ja.com

HttpRequest vs HttpRequestMessage vs HttpRequestBase

ASP.NETのこれらのクラスの違いは何ですか?私が発見したように、これらのクラス間に継承関係はありません。

以下のコードはHttpRequestWrapperのインスタンスを返します。これはis aHttpRequestBaseおよびhas aHttpRequest

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

マイクロソフトはHttpRequestMessageからCookieにアクセスしている間、私たちを困らせたかったようです。

request.Properties["MS_HttpContext"]がnullにならないことが保証されていますか?

または、AjaxリクエストはApiControllerのアクションで処理されると考えます。 2つの異なる方法でクライアントのIPにアクセスできます。

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

var ip = HttpContext.Current.Request.UserHostAddress

これら2つの違いは何ですか?

または、一般に、Cookie、ヘッダー、リクエスター情報など、同じリクエスト/レスポンスデータにさまざまな方法でアクセスできます。どちらを使用するか? 「ajaxリクエストの場合、何かが足りないためにHttpRequestが正常に動作することが保証されていないので、代わりにHttpRequestMessageを使用する必要があります」などと言えますか?

48
Mehmet Ataş

HttpRequestPage および serControl クラスにGET専用プロパティとして存在します。同様に、独自のプロパティのほとんどもGET専用です( 1 を参照)。このクラスは、着信HTTPリクエストに関する情報を取得するためにASP.NETページで使用されます。クライアントIP、Cookie、クエリ文字列などを読み取ります。重要なのは、.NET 1.1以降に存在する「古い」System.Webアセンブリの一部であるということです。

HttpRequestMessage は、一方で、.NET 4.5の新機能です。 System.Net の一部です。クライアントとサービスの両方で使用して、HTTP経由で要求と応答を作成、送信、受信できます。 HttpWebRequest を置き換えます。これは.NET 4.5で廃止されました

HttpRequestBaseとHttpRequestWrapperでできることは、 docs を引用することです。

HttpRequestWrapperクラスは、HttpRequestBaseクラスから派生し、HttpRequestクラスのラッパーとして機能します。このクラスは、HttpRequestクラスの機能を公開し、HttpRequestBase型を公開します。 HttpRequestBaseクラスを使用すると、ASP.NETパイプラインの外部でユニットテストを実行する場合など、アプリケーションのHttpRequestクラスの元の実装をカスタム実装に置き換えることができます。

43
Filip