使用 HttpRequest 對象 HttpRequest 對象描述的是一個正在被處理的 HTTP 請求。下表列舉了 HttpRequest 中的屬性,它們提供了當前請求的相關信息(HttpRequest 類定義了一些方法和屬性,我們會逐步講解當中的一些屬性)。 表 1 – HttpRequest
使用 HttpRequest 對象
HttpRequest 對象描述的是一個正在被處理的 HTTP 請求。下表列舉了 HttpRequest 中的屬性,它們提供了當前請求的相關信息(HttpRequest 類定義了一些方法和屬性,我們會逐步講解當中的一些屬性)。
表 1 – HttpRequest 類中屬性
名稱 | 描述 |
AcceptTypes | 返回一個可以被瀏覽器接受的 MIME 類型的字元串數組。 |
Browser | 返回一個可以用來描述瀏覽器功能的 HttpBrowserCapabilities 對象。 |
ContentEncoding | 返回一個 System.Text.Encoding 對象,用來描述對請求數據進行編碼的字元集。 |
ContentLength | 返回請求內容的位元組數。 |
ContentType | 返回請求中內容的 MIME 類型。 |
CurrentExecutionFilePathExtension | 返回請求的 URL 文件擴展組件。 |
Headers | 返回一個包含請求頭的集合。 |
HttpMethod | 返回發起請求的 HTTP 方法(GET, POST, 等等)。 |
InputStream | 返回一個可以讀取請求內容的流。 |
IsLocal | 如果請求源自本機,那麼返回 true。 |
MapPath(path) | 將項目中的文件名轉換成絕對路徑。 |
RawUrl | 返回緊跟著主機名的那部分 URL。換句話說,比如,http://apress.com:80/books/Default.aspx,那麼這個屬性就會返回 /books/Default.aspx。 |
RequestContext | 返回一個請求上下文對象用來提供獲取一個請求的路由信息。 |
Url | 返回一個 System.Uri 對象用來表示請求 URL。 |
UrlReferrer | 返回一個 System.Uri 對象用來表示訪問來源 URL。 |
UserAgent | 返回瀏覽器提供的 user-agent 字元串。 |
UserHostAddress | 返回遠程客戶端的 IP 地址,用一個字元串表示。 |
UserHostName | 返回遠程客戶端的 DNS 名稱。 |
UserLanguages | 返回一個字元串數組表示瀏覽器/用戶偏好的語言。 |
為了闡述 HttpRequest 類的使用,我已經修改了 Index.cshtml 文件,用來顯示一些請求屬性。
1 @using SimpleApp.Models 2 @model List<string> 3 4 @{ 5 Layout = null; 6 } 7 8 <!DOCTYPE html> 9 10 <html> 11 <head> 12 <meta name="viewport" content="width=device-width" /> 13 <title>Vote</title> 14 <link href="~/Content/bootstrap.min.css" rel="stylesheet" /> 15 </head> 16 <body class="container"> 17 <div class="panel panel-primary"> 18 @if (ViewBag.SelectedColor == null) 19 { 20 <h4 class="panel-heading">Vote for your favourite color</h4> 21 } 22 else 23 { 24 <h4 class="panel-heading">Change your vote from @ViewBag.SelectedColor</h4> 25 } 26 27 <div class="panel-body"> 28 @using (Html.BeginForm()) 29 { 30 @Html.DropDownList("color", new SelectList(Enum.GetValues(typeof(Color))), "Change a Color", new { @class = "form-control" }) 31 32 <div> 33 <button class="btn btn-primary center-block" type="submit">Vote</button> 34 </div> 35 } 36 </div> 37 </div> 38 39 <div class="panel panel-primary"> 40 <h5 class="panel-heading">Results</h5> 41 <table class="table table-condensed table-striped"> 42 <tr><th>Color</th><th>Votes</th></tr> 43 @foreach (Color c in Enum.GetValues(typeof(Color))) 44 { 45 <tr> 46 <td>@c</td> 47 <td>@Votes.GetVotes(c)</td> 48 </tr> 49 } 50 </table> 51 </div> 52 53 <div class="panel panel-primary"> 54 <h5 class="panel-heading">Request Properties</h5> 55 <table class="table table-condensed table-striped"> 56 <tr><th>Property</th><th>Value</th></tr> 57 <tr><td>HttpMethod</td><td>@Request.HttpMethod</td></tr> 58 <tr><td>IsLocal</td><td>@Request.IsLocal</td></tr> 59 <tr><td>RawURL</td><td>@Request.RawUrl</td></tr> 60 </table> 61 </div> 62 </body> 63 </html>View Code
HttpRequest 對象使用得很頻繁以致一些應用組件,包括 Razor 視圖,都提供了方便的屬性,這樣我們就不需要為了獲取一個 HttpRequest 實例而動用 HttpContext 對象。下表總結了可以獲取到 HttpRequest 對象的方便屬性:
表 2 - 在不同的 ASP.NET/MVC 組件中獲取一個 HttpRequest 對象
組件 | 技術 |
Controller | 使用方便的 Request 屬性。 |
View | 使用方便的 Request 屬性。 |
全局應用類 | 使用方便的 Request 屬性。 |
模塊 | 沒有方便的屬性可用。使用 HttpContext.Request 屬性。 |
處理器 | 沒有方便的屬性可用。使用 HttpContext.Request 屬性。 |
全局 | 總是可以通過靜態的 HttpContext.Current.Request 屬性獲取到 HttpRequest 對象。 |
圖 1 - 展示請求的詳細信息
除了表 1 中提到的屬性,一個請求中還包括了其他的屬性來獲取數據。我在下表列舉了出來,但是因為模型綁定的緣故,它們不直接在 MVC controllers 中使用,這在 Pro ASP.NET MVC 5 中講到過。然而,這些屬性也有時候在模塊中使用到。
表 3 – HttpRequest 類中定義的額外屬性
名稱 | 描述 |
Files | 返回一個瀏覽器表單中發送的文件集合。 |
Form | 提供對原始表單數據的訪問。 |
Params | 一個來自查詢字元串,表單欄位,和 cookies 的組合數據項集合。也可以直接在 HttpRequest 對象上使用一個類數組的索引,比如 Request[“myname”] 和 Request.Params[“myname”] 是等同的。 |
QueryString | 返回一個查詢字元串參數的集合;這個屬性通常不直接在 MVC 應用中使用。 |
[根據 Adam Freeman – Pro ASP.NET MVC 5 Platform 選譯]