[译] ASP.NET 生命周期 – ASP.NET 上下文对象(七)

时间:2021-02-18 08:43:34

使用 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 文件,用来显示一些请求属性。

 @using SimpleApp.Models
@model List<string> @{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Vote</title>
<link href="~/Content/bootstrap.min.css" rel="stylesheet" />
</head>
<body class="container">
<div class="panel panel-primary">
@if (ViewBag.SelectedColor == null)
{
<h4 class="panel-heading">Vote for your favourite color</h4>
}
else
{
<h4 class="panel-heading">Change your vote from @ViewBag.SelectedColor</h4>
} <div class="panel-body">
@using (Html.BeginForm())
{
@Html.DropDownList("color", new SelectList(Enum.GetValues(typeof(Color))), "Change a Color", new { @class = "form-control" }) <div>
<button class="btn btn-primary center-block" type="submit">Vote</button>
</div>
}
</div>
</div> <div class="panel panel-primary">
<h5 class="panel-heading">Results</h5>
<table class="table table-condensed table-striped">
<tr><th>Color</th><th>Votes</th></tr>
@foreach (Color c in Enum.GetValues(typeof(Color)))
{
<tr>
<td>@c</td>
<td>@Votes.GetVotes(c)</td>
</tr>
}
</table>
</div> <div class="panel panel-primary">
<h5 class="panel-heading">Request Properties</h5>
<table class="table table-condensed table-striped">
<tr><th>Property</th><th>Value</th></tr>
<tr><td>HttpMethod</td><td>@Request.HttpMethod</td></tr>
<tr><td>IsLocal</td><td>@Request.IsLocal</td></tr>
<tr><td>RawURL</td><td>@Request.RawUrl</td></tr>
</table>
</div>
</body>
</html>

HttpRequest 对象使用得很频繁以致一些应用组件,包括 Razor 视图,都提供了方便的属性,这样我们就不需要为了获取一个 HttpRequest 实例而动用 HttpContext 对象。下表总结了可以获取到 HttpRequest 对象的方便属性:

表 2 - 在不同的 ASP.NET/MVC 组件中获取一个 HttpRequest 对象

组件 技术
Controller 使用方便的 Request 属性。
View 使用方便的 Request 属性。
全局应用类 使用方便的 Request 属性。
模块 没有方便的属性可用。使用 HttpContext.Request 属性。
处理器 没有方便的属性可用。使用 HttpContext.Request 属性。
全局 总是可以通过静态的 HttpContext.Current.Request 属性获取到 HttpRequest 对象。

[译] ASP.NET 生命周期 – ASP.NET 上下文对象(七)[译] ASP.NET 生命周期 – ASP.NET 上下文对象(七)

图 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 选译]