ASP.Net 内置对象

网友投稿 432 2022-05-29

Response对象

Response对象主要用于将数据从服务器发送回浏览器。

2、Response对象的常用属性及说明

属性

说明

Buffer

获取或设置一个值,该值指示是否缓冲输出,并在完成处理整个相应之后将其发送。

Cache

获取Web页的缓存策略,如过去时间、保密性、变化字句等。

Charset

设定或获取HTTP的输出字符编码

Expires

获取或设置在浏览器上缓存的页过期之前的分钟数

BufferOutput

获取或设置一个值,该值指示是否缓冲输出,并在完成处理整个页之后将其发送。

Cookies

获取当前请求的Cookie集合。

IsClientConnected

传回客户端是否仍然和Server连接

SuppressContent

设定是否将HTTP的内容发送至客户端浏览器。若为true,则网页将不会传至客户端。

BufferOutput属性

该属性用于获取或设置一个值,该值指示是否缓冲输出,并在完成处理整个页之后将其发送。语法如下:

Public bool BufferOutput{get;set;}

数型值:如果缓冲了到客户端的输出,则为true;否则为False。默认为True。

protected void Page_Load(object sender, EventArgs e) {

Response.BufferOutput = true;

Response.Write("测试");

}

IsClientConnected属性

该属性用于获取一个值,通过该值指示客户端是否仍连接在服务器上。

语法如下:public bool IsClientConnected{get;}

属性值:如果客户端当前仍在连接,则为true,否则为false。例:

protected void Page_Load(object sender, EventArgs e)

{

if (Response.IsClientConnected)

Response.Redirect("WebForm1.aspx");

else

Response.End();

}

Response常用的方法及说明

AddHeader

将一个HTTP头添加到输出流

AppendToLog

将自定义日志信息添加到IIS日志文件。

Clear

将缓冲区的内容清除。

End

将目前缓冲区中所有的内容发送至客户端,然后关闭。

Flush

将缓冲区所有的数据发送至客户端。

Redirect

将网页重新导向另一地址。

Write

将数据输出到客户端

WriteFile

将制定的文件直接写入HTTP输出流

Redirect方法 该方法用于将网页重新导向另一个地址。语法如下:

Public void Redirect(string url)

参数url:客户端用来定位请求资源的URL

说明:在构建Web页面时,需要用户导向另外一个页面。例如,用户查询资料时就需要跳转,这时可以使用Page类的Redirect属性中的一个对象Redirect帮助完成工作。

例:用户从登陆页面进入网站主页时,输入合法的用户名和密码之后,通过调用Response对象的Redirect方法就可以跳转到网站主页面。代码如下:Response.Redirect(“Index.aspx”);

(2)Write方法

该方法用于将数据输出到客户端,语法如下:Response.Write(“输出字符串”);

例:

Response test

<%

For ( int i=0;i<50;i++){ Response.Write(“X”);}

%>

(3)WriteFile方法

该方法用于将指定的文件直接写入HTTP输出流。语法如下:public void WriteFile(string filename);参数filename:要写入HTTP输出的文件名。例:

Response.WriteFile(Server.MapPath(@”TextFile.txt”);

Request对象

Request对象,可称为请求对象。该对象是HttpRequest类的一个实例,用于提供当前页请求访问,其中包括标题、CooKie、查询字符串等,用户可以使用此类来读取浏览器已经发送的内容。当用户打开浏览器,并从网站请求web页时,Web服务器就会收到一个请求,其中包含用户、用户的计算机、页面以及浏览器的相关信息,这些信息将被完整的封装,并在Request对象中利用他们。以上这些信息都是通过Request对象一次性提供的。

Request对象的常用属性及说明

ApplicationPath

获取服务器上ASP.NET应用程序虚拟应用程序的根目录路径

Browser

获取或设置有关正在请求的客户端浏览器的功能信息

ContentLength

指定客户端发送的内容长度(以字节计)

Cookies

获取客户端发送的Cookie集合

FilePath

获取当前请求的虚拟路径

Files

获取客户端上载的文件集合

Form

获取窗体变量的集合

Item

从Cookies、Form、QueryString或ServerVariables集合获取指定的对象

Params

获取QueryString、Form、ServerVariables和Cookies项的组合集合

Path

获取当前请求的虚拟路径

QueryString

获取HTTP查询字符串变量集合

UserHostAddress

获取远程客户端IP主机地址

UserHostName

获取远程客户端DNS名称

Browser属性 该属性用于获取或设置有关正在请求的客户端浏览器的信息。语法如下:public HttpBrowserCapabilies Browser{get;set;}

属性值:列出客户端浏览器功能的HttpBrowserCapabilities对象。例:

protected void Page_Load(object sender, EventArgs e)

{

Response.Write("浏览器使用的平台:"+Request.Browser.Platform+"
"+"浏览器类型:"+Request.Browser.Type+"
"+"浏览器版本:"+Request.Browser.Version);

}

QueryString属性

该属性用于获取HTTP查询字符串变量的集合、

语法如下:public NameValueCollection QueryString{get;}

属性值:NameValueCollection,包含由客户端发送的查询字符串变量的集合。

Request对象的常用的方法及说明

方法

说明

MapPath

将当前请求的URL中的虚拟路径映射到服务器上的物理路径

SaveAs

将HTTP请求保存到磁盘

MapPath方法

该方法用于接收一个字符串类型的参数,并返回当前文件所在的实际路径。该方法主要应用在需要使用实际路径的位置。例如,建立数据源连接是,必须制定完整的路径,这是就可以使用MapPath方法将其取回。语法如下:

Public string MapPath(string virtualPath)

参数virtualPath:当前请求的虚拟路径(绝对路径或相对路径)。

返回值:由virtualPath指定的服务器物理路径。

例如,下面的代码用来取得页面Default.aspx的物理路径。

String str=Request.MapPath(“Default.aspx”);

(2)SaveAs方法

该方法用于将HTTP请求保存到硬盘上,在调试过程中非常有用。

语法如下:

Public void SaveAs(string filename.bool includeHeaders)

参数说明:filename:物理驱动器路径。

IncludeHeaders:一个布尔值,该值指定是否将HTTP头保存到磁盘。例:

protected void Page_Load(object sender, EventArgs e)

{

Request.SaveAs(Server.MapPath("TextFile1.txt"), true);

}

Response应用

例:当程序运行时,在页面Default.aspx中的TestBox文本框输入一个值,单击搜索按钮,将Testbox文本框中的值传到WebForm1.aspx页面的地址栏中。

主要代码:

1、Default.aspx

protected void btnSearch_Click(object sender, EventArgs e)

{

Response.Redirect("WebForm1.aspx?id=" + txt.Text);

}

2、WebForm1.aspx

protected void Page_Load(object sender, EventArgs e)

{

Response.Write("地址栏传值id为:" + Request.QueryString["id"]);

}

Application对象

Application对象,可称之为记录应用程序参数的对象,主要用于共享应用程序集信息。Application对象用于共享应用程序集信息,即多个用户共享一个Application对象。在第一个用户请求ASP.NET文件时,将启动应用程序并创建Application对象。一旦Application对象被创建,它就可以共享和管理整个应用程序的信息。在应用程序关闭之前,Application对象将一直存在。所以,Application对象是用于启动和管理ASP.NET应用程序的主要对象。

Application对象的常用属性及说明

属性

说明

AllKeys

返回全部Application对象变量名到一个字符串数组中

Count

获取Application对象变量的数量

Item

允许使用索引或Application变量名传回内容值。

Count属性 该属性用于获取Application对象变量的数量

语法如下:public override int Count{get;}属性值:集合中的Item对象数,默认值为0。例:

protected void Page_Load(object sender, EventArgs e)

{

Application["app1"] = "app1";

Application["app2"] = "app2";

Response.Write("Application对象的数量为:" + Application.Count);

}

Item属性 该属性可以重载,有两种格式,分别通过索引和名称来获取单个Application对象的值。语法如下:

Public Object this[int index]{get;}//index集合中对象的数字索引

Public Object this [string name]{get;set;}//集合中的对象名

例:

protected void Page_Load(object sender, EventArgs e)

{

Application["app1"] = "app1";

Application["app2"] = "app2";

Response.Write(Application["app1"].ToString());

Response.Write(Application[1].ToString());

}

Application对象的常用方法及说明

方法

说明

Add

新增一个Application对象变量

Clear

清除全部Application对象变量

Lock

锁定全部Application对象变量

Remove

使用变量名移除一个Application对象变量

RemoveAll

移除全部Application对象变量

UnLock

解除锁定的Application对象变量

Add方法 该方法用于将新变量添加到Application集合中。语法如下:

Public void Add(string name,Object value);

参数说明: name:要添加到Application对象中的变量名。Value:变量的值。例:

Application.Add(“mr”,”mr”); Application.Add(“mrsoft”,”mrsoft”);

(2) Lock方法 该方法用于锁定全部的Application对象变量。语法如下:

Public void Lock();

例如:统计在线人数时,就应该先对Application对象家锁,以防止因为多个用户同时方位页面而造成并行。常用格式如下:

Application.Lock();Application(“变量”)=”表达式”;Application.UnLock();

说明:Lock方法可以阻止其他用户修改存储在Application对象中的变量,以确保在同一时刻仅有一个用户可以修改和存取Application变量。如果用户没有明确使用Unlock方法,则服务器将在页面文件结束或超出时即解除对Application对象的锁定。Unlock方法可以使其他客户端使用Lock方法锁住Application对象后,修改存储在该对象中的变量。如果未显式地调用该方法,Web服务器将在页面文件结束或超出后解锁Application对象。

Remove方法 该方法用于指定变量从Application集合中移除。语法如下:

Public void Remove(string name)

参数Name:要从Application对象中移除的变量名。

例如:下面的代码将mr的应用程序变量从Application集合中移除。

Application.Remove(“mr”);

如果压移除Application集合中所有变量,可以直接调用其RemoveAll方法。代码如下:Application.RemoveAll();

Application对象常用的事件

Application_Start事件,在首次创建新的会话之前发生,只有Application和Server内置对象可使用。在Application_Start事件中引用Session、Request

或Response对象将导致错误。由于Application对象是多用户共享的,因此它与Session对象有着本质的区别;同时Application 对象不会因为一个甚至全部用户离开而消失,一旦建立了Application对象,他就会一直存在直到网站关闭或者该Application对象被卸载,这通常需要很长时间。由于Application对象创建之后不会自己注销,因此一定要特别小心地使用。另外,它会占用内存,要避免降低服务器对其他工作的相应速度。中止Application对象有3中方法,分别为服务被终止,Global.asax文件被改变或者该Application对象被卸载。例:

protected void Application_Start(object sender, EventArgs e)

{

Application["Name"] = "sgusauyfdsg";

}

Application_End事件 在应用程序退出时用于Session_End事件之后发生,只有Application和Server内置对象可使用。Application_End事件只有在服务中止或者Application对象卸载时才会触发。如果单独使用Application对象,该事件可以通过Application对象再利用Unload事件卸载时进行触发。一个Application_End事件肯定发生在Session事件之后。Application_End事件触发唯一一个脚本程序,它存在于Global.asax文件中。注:若果希望服务中止或者Application对象卸载时执行某些操作,可以在Application_End事件中编写相应的代码。

Session对象

Session对象用来存储跨网页程序的变量或者对象。该对象只对单一网页使用者,也就是服务器会为连接的客户端分配各自的Session对象,不同的客户端无法相互存取。当超过设置的有效时间时,Session对象就会消失。与Application对象一样,Session对象也是Page对象的成员,因此可直接在网页中使用。使用Session对象存放信息的语法如下:

Session[“变量名”]=“内容”;

Session对象常用的属性及说明

属性

说明

Contents

获取对当前会话状态对象的引用

Item

获取或设置会话值

TimeOut

设置Session对象的有效时间,默认值为20分钟

Contents属性 获取当前会话状态对象的引用。语法如下:

Public HttpSessionState Contents{get;}

属性值:当前的HttpSessionState

例:

protected void Page_Load(object sender, EventArgs e)

{

Session["id1"] = "id1e";

Session["id2"] = "isd2";

foreach (string str in Session.Contents)

{

Response.Write(Session[str].ToString());

Response.Write("
");

}

}

(2)TimeOut属性

该属性用于获取并设置在会话状态提供程序终止会话之前各请求之间所允许的时间(以分钟为单位)。

语法:public int TimeOut{get;set;}

属性值:超时时限(以分钟为单位)

注:更改Timeout属性的值也可以在Web.Config中,使用sessionSate配置元素的timeout属性来设置Timeout属性,也可以使用程序代码直接设置Timeout属性值。Timeout属性不能超过525600(1年)的值。

例: 

Session对象常用的方法

属性

说明

Abandon

结束当前会话,并清除会话中的所有信息。

Add

用于向Session对象集合中添加一个新项

CopyTo

将会话状态值的集合复制到一维数组中

Clear

清除全部的Session对象变量,但不结束会话

Clear 该方法用于清除全部Session对象变量。

语法如下:public void Clear()

例:Session.Clear();

Add 该方法用于向Session对象集合中添加一个新项。

语法如下:public void Add(string name,Object value);

参数说明:name 要添加到Session对象集合中的名称

Value要添加到Session对象集合中的项的值。

例:Session.Add(“test”,”test文本”);

Session对象应用:Session对象的用途有很多,如存储变量,判断用户是否登录等。例:

(1)登录页面

代码:

protected void btnLogin_Click(object sender, EventArgs e)

{

if (txtName.Text == "mr" && txtPwd.Text == "mrsoft")

{//使用Session变量记录用户名

Session["UserName"] = txtName.Text;

//使用Session变量记录用户登录系统的时间                               Session["TimeLogin"] = DateTime.Now;

Response.Redirect("~/UserPage.aspx");//跳转到主页

}

else

{

Response.Write("");

}

}

(2)Session对象记录用户登录名及登录时间

protected void Page_Load(object sender, EventArgs e)

{

Response.Write("欢迎用户" + Session["UserName"].ToString() + "登录本系统!
");

Response.Write("您登录的时间为:" + Session["TimeLogin"].ToString());

}

CooKie对象

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

Cookie对象常用的属性及说明

属性

说明

Clear

清除所有的Cookie

Expires

设定Cookie变量的有效时间,默认为100分钟,若设置为0,则实时删除Cookie变量。

Name

取得Cookie变量的名称

Value

获取或设置Cookie变量的内容值

Path

设置与当前Cookie一起传输的虚拟路径

Expires属性 该属性用于设置Cookie对象的两个常用属性。语法如下:

Public Datatime Expires{get;set;}

属性值:Cookie的过去时间(在客户端)

例:  protected void Page_Load(object sender, EventArgs e)

{

HttpCookie cookie = new HttpCookie("UserName");

cookie.Value = "明日科技";

cookie.Expires = DateTime.Now.AddMinutes(20);

}

Path属性 用于设置与当前Cookie一起传输的虚拟路径

语法如下:public string Path{get; set;}

属性值:要与前Cookie一起传输的虚拟路径。默认为当前请求的路径。例:

HttpCookie cookie = new HttpCookie("UserName");

cookie.Value = "明日科技";

cookie.Expires = DateTime.Now.AddMinutes(20);

Response.Cookies.Add(cookie);

Response.Write(Request.Cookies["UserName"].Path);

Cookie对象的常用的方法及说明

方法

说明

Equals

确定指定Cookie是否等于当前的Cookie

ToString

返回此Cookie对象的一个字符串表示形式

ToString方法 表示当前Object 的String。语法如下:

Public virtual string ToString()

返回值:string,表示当前的Object

Equals方法 用于确定指定的Object是否等于当前的Object。语法如下:

Public virtual bool Equals(Object obj)

返回值:如果指定的Object等于当前的Object,则为true,否则为false

例:protected void Page_Load(object sender, EventArgs e)

{

//声明一个HttpCookie实例cookie1

HttpCookie cookie1 = new HttpCookie("userName1");

cookie1.Value = "明日科技";  //赋值给cookie1

//声明一个HttpCookie实例cookie1

HttpCookie cookie2 = new HttpCookie("UserName2");

cookie2.Value = "明日科技";                //赋值给cookie1

Response.Cookies.Add(cookie1);           //添加cookie1

Response.Cookies.Add(cookie2);           //添加cookie2

if(Equals(Request.Cookies["userName1"].Value, Request.Cookies["userName2"].Value))

Response.Write("Cookie值相等"); //两个Cookie对象的值是否相等

else

Response.Write("Cookie值不相等");

}

Server对象

Sever对象定义了一个与Web服务器相关的类,用于访问指定服务器上的资源。

Server对象的常见属性及说明

属性

说明

MachineName

获取服务器的计算机名称

ScriptTimeout

获取或设置请求超时值(以秒计)

MachineName属性 该属性用于获取服务器的计算机名称。语法如下:

Public string MachineName{get;}

属性值:本地计算机的名称

例:Response.Write(Server.MachineName.ToString());

ScriptTimeout 该属性用于获取或设置请求超时值。语法如下:

Public int ScriptTimeout{get;set;}

属性值:请求超时值设置

Server对象常用的方法及说明

方法

说明

HtmlDecode

对已被编码以消除无效HTML字符的字符串进行编码

HtmlEnCode

对要在浏览器中显示的字符串进行编码

MapPath

返回与Web服务器上的指定虚拟路径相对应的物理文件路径

UrlDecode

对字符串进行编码,该字符串为了进行HTTP传输而进行编码并在URL中发到服务器

UrlEncode

编码字符串,以便通过URL从Web服务器到客户端进行可靠的HTTP传输

MapPath方法   用于返回与Web服务器上的指定虚拟路径相对的物理文件路径。语法如下:public string MapPath(string path)

参数path: web服务器的虚拟路径

例:Response.Write(Server.MapPath("Default.aspx"));

HtmlEncode方法 用于对字符串进行HTML编码,并返回已编码的字符串。语法如下:public string HtmlEncode(string s)

例:Server.HtmlEncode(“浏览器中字符串”+”
”);

//结果:浏览器中字符串

HtmlDecode方法 用于字符串进行HTML编码并返回已编码的字符串

语法如下:public string HtmlDecode(string s)

参数:s 要舅妈的HTML字符串

例:Server.HtmlEncode(“浏览器中字符串”+”
”);//结果:浏览器中字符串

综合应用:

例1,统计IP地址的登录次数

后台代码:

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

int lastVisitCounter;

if (Request.Cookies["lastVisitCounter"] == null)

lastVisitCounter = 0;

else

lastVisitCounter = int.Parse(Request.Cookies["lastVisitCounter"].Value);

lastVisitCounter++;

HttpCookie aCookie = new HttpCookie("lastVisitCounter");

aCookie.Value = lastVisitCounter.ToString();

aCookie.Expires = DateTime.MaxValue;

Response.Cookies.Add(aCookie);

txtSum.Text = lastVisitCounter.ToString();

}

}

protected void Button1_Click(object sender, EventArgs e)

{

if (Request.Cookies["lastVisitCounter"] == null)

txtSum.Text = "1";

else

{

HttpCookie aCookie = Request.Cookies["lastVisitCounter"];

txtSum.Text = Server.HtmlEncode(aCookie.Value);

}

}

例2、获取浏览器的信息

protected void Page_Load(object sender, EventArgs e)

{

//获取浏览器的平台、类型和版本信息

lblinfo.Text = "浏览器使用的平台:" + Request.Browser.Platform + "
"

+ "浏览器类型:" + Request.Browser.Type + "
" + "浏览器版本:"

+ Request.Browser.Version;

}

例3、输出文本文件的内容

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

StreamReader sr = File.OpenText(Server.MapPath("桃花仙人.txt"));

string rl;

while ((rl = sr.ReadLine()) != null)

{

Response.Write(rl+"
");

}

sr.Close();

}

}

例4、创建一个网站,使用Response对象的Redirect方法实现页面跳转并传递参数。

Default.aspx页面

protected void Button1_Click(object sender, EventArgs e)

{

//获取用户名和密码

string name = txtUserName.Text.Trim();

string pwd = txtPwd.Text.Trim();

string strsql = "select count(1) from tb_user where userName='" + name + "' and userPwd='" + pwd + "'";

SqlConnection conn =new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["conn"].ToString());

conn.Open();

SqlCommand cmd = new SqlCommand(strsql, conn);

int flag = int.Parse(cmd.ExecuteScalar().ToString());

conn.Close();

if (flag > 0)

{

Session["users"] = name;

Response.Redirect("admin.aspx");

}

else

{

ClientScript.RegisterStartupScript(this.GetType(), "", "alert('用户名或密码错误');", true);

}

}

Admin.aspx

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

if (Session["users"] != null)

{

lblinfo.Text = "恭喜你,登录成功";

}

}

}

例5、验证码

起始页Default2.aspx

无标题页


请输入正确的验证码:

protected void Button1_Click(object sender, EventArgs e)

{

string checkCode = Request.Cookies["CheckCode"].Value.ToString().ToLower();

if (checkCode.Equals(TextBox1.Text.ToLower()))

{

Response.Write("");

}

}

Default.aspx后台代码

private string GenerateCheckCode()

{

int number;

char code;

string checkCode = String.Empty;

Random random = new Random();

for (int i = 0; i < 4; i++)

{

number = random.Next();

if (number % 2 == 0)

code = (char)('0' + (char)(number % 10));

else

code = (char)('A' + (char)(number % 26));

checkCode += code.ToString();

}

HttpCookie cookie = new HttpCookie("CheckCode", checkCode);

cookie.Expires = DateTime.Now.AddSeconds(30);

Response.Cookies.Add(cookie);

return checkCode;

}

protected void Page_Load(object sender, EventArgs e)

{

string checkCode = GenerateCheckCode();

System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 20.5)), 22);

Graphics g = Graphics.FromImage(image);

try

{

//生成随机生成器

Random random = new Random();

//清空图片背景色

g.Clear(Color.White);

//画图片的背景噪音线

for (int i = 0; i < 2; i++)

{

int x1 = random.Next(image.Width);

int x2 = random.Next(image.Width);

int y1 = random.Next(image.Height);

int y2 = random.Next(image.Height);

g.DrawLine(new Pen(Color.Black), x1, y1, x2, y2);

}

Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold));

System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);

g.DrawString(checkCode, font, brush, 2, 2);

//画图片的前景噪音点

for (int i = 0; i < 100; i++)

{

int x = random.Next(image.Width);

int y = random.Next(image.Height);

image.SetPixel(x, y, Color.FromArgb(random.Next()));

}

g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); //画图片的边框线

System.IO.MemoryStream ms = new System.IO.MemoryStream();

image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

Response.ClearContent();

Response.ContentType = "image/Jpeg";

Response.BinaryWrite(ms.ToArray());

}

finally

{

g.Dispose();

image.Dispose();

}

}

例6、统计网站的访问量

Default.asp前台代码

 

 

 

 

 

您是第<%=Application["counter"]%>位访问者 

Global.aspx代码

<%@ Application Language="C#" %>

例7、统计当前在线人数。当新用户访问网站时,会触发Session_Start事件,当用户有效期失效时,会触发Session——End事件。所以在这两个事件统计在线人数是比较科学的。

Default.aspx前台代码

style="background-image: url('网站在线访问人数统计.png')">

 

Default.aspx后台代码

protected void Page_Load(object sender, EventArgs e)

{

lblCount.Text="您是第" + Application["count"].ToString() + "位访客";

}

Global.asax文件代码

<%@ Application Language="C#" %>

ASP ASP.NET

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【开天aPaaS】从技术宝库到云上机遇:华为云开天aPaaS的“修路记”
下一篇:张小白全链接大荟
相关文章