ASP.NET中HTTP请求(Request)、响应(Response)以及状态管理讲解

简介: ASP.NET中HTTP请求(Request)、响应(Response)以及状态管理讲解

1. HTTP请求 Request对象


1.1. Request对象常用属性和方法


Request对象是HttpRequest类的一个实例, 它提供对当前页请求的访问,其中包括User-Agent、Address、Cookie、客户端证书、查询字符串等信息,用户可以使用该类来读取浏览器发送到服务器的内容。


部分常用的Request类的属性和方法

image.png

完整的Request属性和方法种类繁多,可以在这个页面详细查看:.NET HttpRequest类


例如下面的代码:


protected void Page_Load(object sender, EventArgs e){
   Response.Write("客户端的信息:</br>");
     Response.Write("发出请求的主机名称:" + Request.UserHostName + "</br>");
     Response.Write("发出请求的主机IP:" + Request.UserHostAddress + "</br>");
     Response.Write("发出请求的主机的User-Agent:" + Request.UserAgent + "</br>");
     Response.Write("请求访问的地址:" + Request.Url + "</br>");
 }


结果如图所示,由于是本地访问,因此主机名称和IP显示为::1:


0a2653c851af460fa595bd959398a8f1.png


1.2. 获取页面间传送的值


在ASP.NET中,可以使用QueryString属性或者Params属性来获取页面间传送的值,它可以获取http请求中携带的键值对。例如如果请求为:


http://www.contoso.com/default.aspx?id=13408&name=FadiFakhouri

则QueryString或Params的值为


id=13408,fullname=FadiFakhouri


这时如果要根据键把值取出,则可用下面代码:


String id = Request.QueryString["id"];
String name = Request.QueryString["name"];
// 或
String id = Request.Params["id"];
String name = Request.Params["name"];


此时服务器即获取到了http请求传入的属性id和name的值


1.3. 获取客户端浏览器相关信息


在ASP.NET中,可以使用Browser属性来获取客户端浏览器相关信息,该属性返回一个HttpBrowserCapabilities对象,这个对象记录了浏览器相关的信息


例如下面的代码,通过HttpBrowserCapabilities 读取浏览器的信息:


protected void Page_Load(object sender, EventArgs e){
    HttpBrowserCapabilities hbc = Request.Browser;
    Response.Write("客户端浏览器的信息:</br>");
    Response.Write("浏览器类型:" + hbc.Type + "</br>");
    Response.Write("浏览器名称:" + hbc.Browser + "</br>");
    Response.Write("浏览器版本:" + hbc.Version + "</br>");
    Response.Write("浏览器支持的主版本号" + hbc.MajorVersion + "<br>");
    Response.Write("浏览器支持的兼容版本号" + hbc.MinorVersion + "<br>");
    Response.Write("浏览器是否为Beta测试版本:" + hbc.Beta + "<br>");
    Response.Write("浏览器是否为爬虫程序:" + hbc.Crawler + "<br>");
    Response.Write("浏览器是否为AOL浏览器:" + hbc.AOL + "<br>");
    Response.Write("浏览器是否运行在Win16计算机上:" + hbc.Win16 + "<br>");
    Response.Write("浏览器是否运行在Win32计算机上:" + hbc.Win32 + "<br>");
    Response.Write("浏览器操作平台:" + hbc.Platform + "</br>");
    Response.Write("浏览器是否支持框架:" + hbc.Frames + "</br>");
    Response.Write("浏览器是否支持表格:" + hbc.Tables + "</br>");
    Response.Write("浏览器是否支持Cookie:" + hbc.Cookies + "</br>");
    Response.Write("浏览器是否支持VB:" + hbc.VBScript + "<br>");
    Response.Write("浏览器是否支持JavaScript:" + hbc.JavaScript + "<br>");
    Response.Write("浏览器是否支持Applets:" + hbc.JavaApplets + "<br>");
    Response.Write("浏览器是否支持ActiveX:" + hbc.ActiveXControls + "<br>");
    Response.Write("浏览器是否支持用于网络广播频道定义格式(CDF):" + hbc.CDF + " <br>");
}


结果为:


2d65d23f6d4748949b924e4057485923.png


2. HTTP响应 Response对象


2.1. Response对象常用属性和方法


Response对象用于将数据从服务器发送回浏览器,它允许将数据作为请求的结果发送到浏览器中,并提供有关响应的信息,另外,它还可以用来在页面中输入数据、跳转或者传递页面中的参数。


部分常用的Response类的属性和方法


image.png


完整的Response属性和方法种类繁多,可以在这个页面详细查看:.NET HttpResponse类


2.2. 在页面中输出指定信息数据


使用Write方法和WriteFile方法可以在.asp页面中输出数据,可以输出的数据包括:字符、字符串、字符数组、对象和文件


例如下面的代码:


protected void Page_Load(object sender, EventArgs e){
    // 输出字符
    char ch = 'a';
    Response.Write("输出单个字符:" + ch + "</br>");
    // 输出字符串
    String str = "abcd";
    Response.Write("输出字符串:" + str + "</br>");
    // 输出字符数组的类型和内容
    char[] chArray = {'a', 'c', 'e', 'g', 'i' };
    Response.Write("输出字符数组:" + chArray + "</br>");
    Response.Write(chArray, 0, chArray.Length);
    Response.Write("</br>");
    // 输出对象类型
    Page page = new Page();
    Response.Write("输出一个对象:" + page + "</br>");
    // 输出文件路径和内容
    Response.Write("输出文件:" + Server.MapPath("TextFile1.txt") + "</br>");
    Response.WriteFile(Server.MapPath("TextFile1.txt"));
}


结果为:


0a2653c851af460fa595bd959398a8f1.png


2.3. 页面跳转并传递参数


ASP.NET中进行页面跳转并传递参数主要用到Response对象的Redirect方法,在进行调转时,如果有参数附加在链接中,可以使用"?“来分割页面地址和参数,如果有多个参数的话,可以用”&"来分割参数。


例如下面两个ASP页面WebForm1和WebForm2


// WebForm1.aspx
...
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="Label1" runat="server" Text="姓名"></asp:Label>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </div>
        <div>
            <asp:Label ID="Label2" runat="server" Text="性别"></asp:Label>
            <asp:RadioButton ID="RadioButton1" runat="server" OnCheckedChanged="RadioButton1_CheckedChanged" Text="男" GroupName="sex" />
            <asp:RadioButton ID="RadioButton2" runat="server" Text="女" GroupName="sex" />
        </div>
        <div>
            <asp:Button ID="Button1" runat="server" Text="登录" OnClick="Button1_Click" />
        </div>
    </form>
</body>
...
// WebForm1.aspx.cs
protected void Button1_Click(object sender, EventArgs e){
     String name = TextBox1.Text;
     String sex = "";
     if (RadioButton2.Checked){
         sex = "女士";
     } else if (RadioButton1.Checked) {
         sex = "先生";
     }
  // WebForm2.aspx?name=name&sex=sex
     Response.Redirect("WebForm2.aspx?name=" + name + "&sex=" + sex);
 }
// WebForm2.aspx.cs
protected void Page_Load(object sender, EventArgs e){
    // String name = Request.Params["name"];
    // String sex = Request.Params["sex"];
    String name = Request.QueryString["name"];
    String sex = Request.QueryString["sex"];
    Response.Write("欢迎" + name + sex + "登录本系统");
}


运行结果如下:


2d65d23f6d4748949b924e4057485923.png


3. Server对象


3.1. Server对象常用属性和方法

Server对象定义了一个与Web服务器相关的类,提供方法和属性用于访问服务器上的资源。


它常用的属性和方法有:


image.png


3.2. 获取服务器的物理地址


获取服务器的物理地址可以使用MapPath方法,一般写作


Server.MapPath("WebForm.aspx");


例如下面的代码:


protected void Page_Load(object sender, EventArgs e){
    Response.Write(Server.MapPath("WebForm1.aspx"));
}


运行结果如下所示,可以看到,虚拟地址WebForm1.aspx被转换为了实际的物理地址C:\Users\DELL\source\repos\WebApplication5\WebApplication5\WebForm1.aspx


0a2653c851af460fa595bd959398a8f1.png


需要注意的是,MapPath方法不接受相对路径的写法,放入MapPath的参数一定要是绝对路径


3.3. 对字符串进行编码和解码


对字符串进行编码可以使用UrlEncode方法,将要进行编码的Url传入URLEncode方法中,就可以得到一个编码后的Url地址,解码可以使用URLDecode方法,用法同理。


如下面代码


protected void Page_Load(object sender, EventArgs e){
    Response.Write(Server.UrlEncode("http://WebForm1.aspx") + "</br>");
    Response.Write(Server.UrlDecode("http%3a%2f%2fWebForm1.aspx") + "</br>");
}


结果为:


2d65d23f6d4748949b924e4057485923.png


4. 状态管理


状态管理分为客户端和服务器端两种


其中客户端状态管理主要是将数据保存到本地的计算机上,当客户端向服务器端发送请求时,数据随之发送到服务器,客户端状态管理可以使用ViewState对象、HiddenField控件或者Cookie对象来实现。


服务器端状态管理是将数据保存到服务器上,可以使用Session对象或者Application对象实现


4.1. 客户端状态管理


4.1.1. ViewState对象


ViewState又称为视图状态,它主要用来获取并保存页面的状态信息。在ASP.NET 中,当一个表单被提交时,所有的表单值都会被清空。开启ViewState可以使得表单提交发生错误时,表单中的数据不会丢失,这样就避免了重复填写数据。


默认情况下,ViewState的所有服务器控件都是启用的,但是对于没有必要维持的页面和控件,可以灵活禁用ViewState,以降低ViewState对站点性能的影响。


禁用ViewState可以使用EnableViewState属性,禁用有两种方法:


禁用这个页面的ViewState

// EnableViewState="false"
<%@ Page EnableViewState="false" Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication5.WebForm2" %>


禁用单个控件的ViewState

// EnableViewState="false"
<asp:Button ID="Button1" runat="server" EnableViewState="false" Text="登录" OnClick="Button1_Click" />


4.1.2. HiddenField控件


HiddenField控件提供了一种在页面中存储信息但不显示信息的方法(隐藏)。例如,可以在HiddenField控件中存储用户首选项设置。


若要将信息放入HiddenField控件中,那么可以在两次回发之间将HiddenField控件的Value属性设置为要存储的值


4.1.3. Cookie对象


Cookie对象用于保存客户端浏览器请求的服务器页面,也可以用它存放非敏感性的用户信息,信息保存的时间可以根据用户的需要进行设置,Cookie中的数据信息是以文本的形式保存在客户端计算机中。


它常用的属性和方法


image.png


例如下面的代码:


// .aspx文件
...
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="Label1" runat="server" Text="姓名"></asp:Label>
            <asp:TextBox ID="TextBox1" runat="server" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
        </div>
        <div>
            <asp:Label ID="Label2" runat="server" Text="密码"></asp:Label>
            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        </div>
        <div>
            <asp:CheckBox ID="CheckBox1" runat="server" Text="记住密码" />
        </div>
        <div>
            <asp:Button ID="Button1" runat="server" EnableViewState="false" Text="登录" OnClick="Button1_Click" />
        </div>
    </form>
</body>
...
// .aspx.cs文件
protected void Button1_Click(object sender, EventArgs e){
    if (TextBox1.Text == "1234" && TextBox2.Text == "1234") {
        if (CheckBox1.Checked) {
            if (Request.Cookies["username"] == null) {
                // 设置Cookie过期时间为30天
                Response.Cookies["username"].Expires = DateTime.Now.AddDays(30);
                Response.Cookies["password"].Expires = DateTime.Now.AddDays(30);
                // 设置Cookie值
                Response.Cookies["username"].Value = TextBox1.Text;
                Response.Cookies["password"].Value = TextBox2.Text;
            }
        }
    }
}
protected void TextBox1_TextChanged(object sender, EventArgs e){
    // 判断Cookie中的用户名是否与用户输入的用户名一致,一致则自动显示用户密码
    if (Request.Cookies["username"] != null) {
        if (Request.Cookies["username"].Value.Equals(TextBox1.Text)) {
            TextBox2.Text = Request.Cookies["password"].Value;
        }
    }
}


效果如下所示,输入用户名1234,按回车键,浏览器会自动填充密码


0a2653c851af460fa595bd959398a8f1.png


4.2. 服务器端状态管理


4.2.1. Session对象


Session对象用来存储跨页面的变量或者对象,它中止于浏览器关闭或者超过设定的Session变量有效时间时,Session对象才会消失。


它常用的属性和方法


image.png


例如下面的代码:


// WebForm1.aspx文件
...
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="Label1" runat="server" Text="姓名"></asp:Label>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </div>
        <div>
            <asp:Label ID="Label2" runat="server" Text="密码"></asp:Label>
            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        </div>
        <div>
            <asp:CheckBox ID="CheckBox1" runat="server" Text="记住密码" />
        </div>
        <div>
            <asp:Button ID="Button1" runat="server" EnableViewState="false" Text="登录" OnClick="Button1_Click" />
        </div>
    </form>
</body>
...
// WebForm1.aspx.cs文件
protected void Button1_Click(object sender, EventArgs e){
    if (TextBox1.Text == "1234" && TextBox2.Text == "1234") {
        Session["username"] = TextBox1.Text;
        Session["time"] = DateTime.Now;
        Response.Redirect("WebForm2.aspx");
    }
}  
// WebForm2.aspx.cs文件
protected void Page_Load(object sender, EventArgs e){
    Response.Write("欢迎" + Session["username"] + "来到本系统</br>");
    Response.Write("您的登录时间为:" + Session["time"]);
}


效果如图所示,点击登录按钮之后,会跳转到第二个页面,并显示存入Session的信息:


0a2653c851af460fa595bd959398a8f1.png


4.2.2. Application对象


Application对象用于共享应用程序级的信息,即多个用户共享一个Application对象。Application对象是用于启动和管理ASP.NET应用程序的主要对象。


实际使用时,在第一个用户第一次请求.aspx页面时,就会启动ASP.NET应用程序并且创建Application对象,在应用程序没有结束之前,Application对象会一直存在


它的主要属性和方法有:


image.png


例如下面的代码,通过Application对象来统计网站的访问量


// .aspx文件
...
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="Label1" runat="server"></asp:Label>            
        </div>        
    </form>
</body>
...
// .aspx.cs文件
protected void Page_Load(object sender, EventArgs e){
    Label1.Text = "网站已被访问" + Application["count"] + "次";
}
// Global.asax.cs文件
protected void Application_Start(object sender, EventArgs e){
    // 创建一个count用来计算访问量,初始化为0
    Application["count"] = 0;
}
protected void Session_Start(object sender, EventArgs e){
    // 访问网站时,访问量+1
    Application.Lock();
    Application["count"] = (int)Application["count"] + 1;
    Application.UnLock();
}


运行效果如下,第一次打开时显示上图,复制地址到另一个浏览器页面打开,显示下图:


0a2653c851af460fa595bd959398a8f1.png


相关文章
|
18天前
|
API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
15 0
|
18天前
|
安全 网络安全 数据安全/隐私保护
HTTPS 请求中的证书验证详解(Python版)
HTTPS 请求中的证书验证详解(Python版)
38 0
|
5月前
|
安全 Android开发
Android之OKHttp基本使用和OKHttp发送https请求安全认证
Android之OKHttp基本使用和OKHttp发送https请求安全认证
149 0
|
2月前
|
数据采集 API 开发者
.NET 8新特性:使用ConfigurePrimaryHttpMessageHandler定制HTTP请求
在.NET 8中,通过`ConfigurePrimaryHttpMessageHandler`方法,开发者能更精细地控制HTTP请求,这对于构建高效爬虫尤为重要。此特性支持定制代理IP、管理Cookie与User-Agent,结合多线程技术,有效应对网络限制及提高数据采集效率。示例代码展示了如何设置代理服务器、模拟用户行为及并发请求,从而在遵守网站规则的同时,实现快速稳定的数据抓取。
.NET 8新特性:使用ConfigurePrimaryHttpMessageHandler定制HTTP请求
|
2月前
|
数据采集 开发框架 .NET
HttpClient在ASP.NET Core中的最佳实践:实现高效的HTTP请求
在现代Web开发中,高效可靠的HTTP请求对应用性能至关重要。ASP.NET Core提供的`HttpClient`是进行这类请求的强大工具。本文探讨其最佳实践,包括全局复用`HttpClient`实例以避免性能问题,通过依赖注入配置预设头部信息;使用代理IP以防IP被限制;设置合理的`User-Agent`和`Cookie`来模拟真实用户行为,提高请求成功率。通过这些策略,可显著增强爬虫或应用的稳定性和效率。
HttpClient在ASP.NET Core中的最佳实践:实现高效的HTTP请求
|
3月前
|
安全 Java 网络安全
RestTemplate进行https请求时适配信任证书
RestTemplate进行https请求时适配信任证书
86 3
|
2月前
|
JavaScript 前端开发 Java
【Azure 环境】各种语言版本或命令,发送HTTP/HTTPS的请求合集
【Azure 环境】各种语言版本或命令,发送HTTP/HTTPS的请求合集
|
2月前
|
开发框架 中间件 .NET
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法
|
2月前
|
网络协议 Go
go的net/http有哪些值得关注的细节?
go的net/http有哪些值得关注的细节?
|
3月前
|
Go
Go中 net/http 使用
Go中 net/http 使用
22 0