4.3 Request对象
在B/S结构的应用程序中,客户端要向服务器端发出请求,这些请求的信息包括客户端信息、请求的URL、请求的参数和Cookie等内容,服务器在接收到用户请求时自动将请求封装到Request对象中供开发者使用。
4.3.1 Request对象的属性
Request对象用来使服务器取得客户端浏览器的数据信息。它实际上是System.Web命名空间中的HttpRequest类的对象。当客户发出请求执行ASP.NET程序时,客户端的请求信息会包装在Request对象中,这些请求信息包括请求报头(Header)、客户端的机器信息、客户端浏览器信息、请求方法(如POST和GET)和提交的窗体信息等。
Request对象的属性和方法相当多,如表4-5所示对常用的属性进行了说明。
表4-5 Request对象的常用属性
在表4-5中列出了多个属性,下面只介绍常用的一些属性,如Browser属性、Form属性和QueryString属性等。
1.Browser属性
Browser属性获取有关正在请求的客户端的浏览器功能的信息,该属性的值是一个HttpBrowserCapabilities对象。如表4-6所示对HttpBrowserCapabilities对象的常用属性进行说明。
表4-6 HttpBrowserCapabilities对象的常用属性
【范例8】
在Web窗体中添加一个Label控件,该控件向页面输出信息,代码如下。
<asp:Label ID="lblMessage" runat="server"></asp:Label>
在窗体页面后台的Load事件中指定Label控件的Text属性值,代码如下。
protected void Page_Load(object sender, EventArgs e) { lblMessage.Text = "浏览器的类型是:" + Request.Browser.Browser + "<br>" + "浏览器的版本是:" + Request.Browser.Version + "<br>" + "浏览器的所在平台是:" + Request.Browser.Platform + "<br>" + "浏览器是否支持框架:" + Request.Browser.Frames + "<br>" + "浏览器是否支持Cookies:" + Request.Browser.Cookies + "<br>" + "浏览器是否支持JavaScript:" + Request.Browser.JavaScript + "<br>"; }
运行窗体页面查看输出结果,如图4-9所示。
图4-9 Browser属性的使用
2.Form属性
Form属性可以检索发送到HTTP语法中控件的值,来实现信息的提交和处理。使用Form属性时需要注意,页面表单提交的方式要设置为POST,与GET相比较,POST可以将大量数据发送到服务器端。
【范例9】
通过Request对象的Form属性获取用户提交的表单的数据,并且判断提交的用户和密码是否为admin。实现步骤如下。
(1)创建FormDefault.aspx窗体页面,指定表单元素的method属性值为post,并在表单中添加一个3行2列的表格,第一行提供用户名输入框,第二行提供密码输入框,最后一行显示操作按钮,代码如下。
<form id="form1" runat="server" method="post"> <table width="100%" height="100px"> <tr><td align="right">登录名:</td><td><asp:TextBox ID="txtName" runat="server"></asp:TextBox></td></tr> <tr><td align="right">登录密码:</td><td><asp:TextBox ID="txtPass" runat="server" TextMode="Password"></asp:TextBox></td></tr> <tr><td></td><td><asp:Button ID="btnSubmit" runat="server" Text=" 登 录" PostBackUrl="~/RequestTest/MessageDefault.aspx" /></td> </tr> </table> </form>
(2)创建MessageDefault.aspx窗体页面,在该页面中添加用于显示结果的Label控件。
(3)在MessageDefault.aspx.cs后台页面的Load事件中添加代码,通过Request.Form属性获取FormDefault.aspx窗体页面控件的值,并判断获取的值是否都等于admin,代码如下。
protected void Page_Load(object sender, EventArgs e) { string name = Request.Form["txtName"].ToString(); string pass = Request.Form["txtPass"].ToString(); if (name == "admin" && pass == "admin") { lblLoginMessage.Text = "用户名:" + name + ",密码:" + pass + "登 录成功。"; } else { lblLoginMessage.Text = "用户名:" + name + ",密码:" + pass + "登 录失败。"; } }
(4)运行FromDefault.aspx页面并输入内容,如图4-10所示。输入内容完毕后单击【登录】按钮,如图4-11所示。
图4-10 登录页面
图4-11 登录效果
注意
通过Response对象的Redirect()方法跳转页面时,源页面保存的所有数据信息将丢失。因此,目标页面无法访问源页面提交的数据,但是可以通过其他方式(如Session对象)实现。本范例中通过Button控件的PostBackUrl属性实现页面跳转。
3.QueryString属性
QueryString属性与Form属性不同,它用于获取HTTP查询字符串变量集合。简单来说,QueryString属性用来获取以GET方式提交的表单数据。使用该属性时,可以通过键名或者索引两种方式获取,语法如下。
Request.QueryString[0]; Request.QueryString["key"]
【范例10】
利用范例9的页面,通过QueryString属性获取用户传入的信息。主要步骤如下。
(1)在QueryStringDefault.aspx页面中设计登录信息,为页面中的Button控件指定Click事件,而不是PostBackUrl属性。
(2)在QueryStringDefault.aspx页面的后台Load事件中添加以下代码。
protected void btnSubmit_Click(object sender, EventArgs e) { Response.Redirect("MessageDefault.aspx? name=" + txtName.Text + "& pass=" + txtPass.Text); }
(3)更改MessageDefault.aspx页面的后台Load事件中的代码,通过QueryString属性的索引方式获取从页面传递的参数信息,代码如下。
string name = Request.QueryString[0].ToString(); string pass = Request.QueryString[1].ToString();
(4)运行QueryStringDefault.aspx窗体页面进行测试,效果不再显示。
4.Params属性
无论以哪种方式(如POST或GET)提交表单数据,如果用错(如GET方式提交表单,Form属性取值)就获取不到信息,这时可以通过Params属性获取数据。Request.Params是所有POST和GET传过来的值的集合,它依次包括Request.QueryString、Request.Form、Request.Cookies和Request.ServerVariable。基本语法如下。
Request.Params["key"]
5.ServerVariables属性
Request对象用ServerVariables属性保存服务器端系统信息,这些信息变量包含在HTTP头部中随HTTP请求一起传送。ServerVariables的使用语法如下。
Request.ServerVariables["服务器变量名称"]
ServerVariables属性中保存多个信息变量,表4-7列出了常用的变量名称。
表4-7 ServerVariables中保存的常用变量名称
如果要查看ServerVariables属性中保存的所有信息变量名称,可以通过foreach语句遍历,代码如下。
foreach (string str in Request.ServerVariables.AllKeys) { Response.Write(str+"<Br/>"); }
提示
除上述介绍的属性外,Request对象还会用到其他属性获取信息,如Url获取当前请求的URL地址,UserHostAddress获取客户端的IP主机地址。这些属性的使用都很简单,这里不再一一列举。
4.3.2 Request对象的方法
Request对象提供一系列的方法,但是并非所有的方法都会被用到。其中,BinaryRead()方法用来对当前输入流进行指定字节数的二进制读取。MapPath()方法将当前请求的URL中的虚拟路径映射到服务器上的物理路径。
MapPath()方法接收一个字符串类型参数,并通过传入的字符串获取相应的物理路径。例如,页面加载时获取当前目录下FormDefault.aspx页面的完整路径,代码如下。
protected void Page_Load(object sender, EventArgs e) { Response.Write(Request.MapPath("FormDefault.aspx")); }