.NET ASP.NET系统对象HttpRequest 丶HttpResponse

一丶 ASP.NET系统对象

在一般处理程序里,通过ProcessRequest方法的参数HttpContext context调用
(1)Page:指向页面自身的方式。作用域为页面执行期。
(2)Request:读取客户端在Web请求期间发送的值(http请求报文数据)
(3)Response:封装了页面执行期返回到HTTP客户端的输出(http响应报文数据)
(4)Application:作用于整个程序运行期的状态对象
(5)Session:会话期状态保持对象,用于跟踪单一用户的会话。
(6)Cookie:客户端保持会话信息的一种方式
(7)Server:提供对服务器上的方法和属性的访问

二丶 Request(HttpRequest) 丶 Response(HttpResponse) 浏览器提交数据方式

(1)表单:(数据藏在请求报文体中,格式:txtname=james&txtpwd=123)

<form action=“login.ashx” method=“post”>
   ​        <input type=“text” name=“txtname” />
   ​    <input type=“password” name=“txtpwd”/>
    </form>

注意:使用表单提交时必须为控件设置name
2. 地址栏的URL参数,超链接的url,js指定的url(和表单的Get方式一样):键值对

服务器如何向浏览器输出数据

context.Response.Write(“我是从服务器输出到浏览器的数据!:)”);

Request(HttpRequest)常用成员

在这里插入图片描述

Response(HttpResponse)常用成员

注意:
当我们点击【提交】按钮以后是浏览器将用户填写的文本框等控件中的值“提取”出来发送给服务器,而不是服务器来读取用户填写的这个页面。哪些标签的哪些值会被提交给服务器呢?将用户填写的内容提交到服务器有如下几个条件:

(1)只能为 input、textarea、select三种类型的标签。只有input(文本框、CheckBox等)用户才可能填写值,、

、等标签仅供显示用,没有提交到服务器的必要。
(2)只有value属性的值才会提交给服务器。以input标签为例,input标签有title、type、disabled等属性,但是这些属性都是供显示用的,用户并不能修改,只有value属性才是用户输入的属性,因此只有value属性的值才会被提交到服务器。
(3)标签必须设定name属性。学习Dom的时候我们知道如果要通过JavaScript操作标签,必须为标签设定Id。如果要将标签的value属性值提交到服务器,则必须为标签设定name属性,提交到服务器的时候将会以“name=value”的键值对的方式提交给服务器,多个键值对之间用&分割。除了单选按钮等少数标签之外,大部分标签的name的值不能重复。name是给服务器用的,id是给Dom用的。对于RadioButton,同name的为一组,选中的RadioButton的value被提交到服务器。
(4)如果设置了控件的disabled属性的话,浏览器也不会提交该控件的值。这是与readonly的区别
(5)放到form标签内。只有放到form标签内的标签才可能会被提交到服务器,form之外的input等标签被忽略。

表单提交方式:Get与Post

(1)还可以设定的method属性指定表单提交方式,get(默认值)是通过URL传递表单值,post传递的表单值是隐藏到http报文体中,url中看到不。
(2)get和post的区别(常考):
get是通过url传递表单值,post通过url看不到表单域的值;get传递的数据量是有限的,如果要传递大数据量不能用get,比如type=“file”上传文章、type=“password”传递密码或者发表大段文章,post则没有这个限制;post会有浏览器提示重新提交表单的问题,get则没有(加分的回答)。对于Post的表单重新敲地址栏再刷新就不会提示重新提交了,因为重新敲地址就没有偷偷提交的数据了。Post方式的正确的地址很难直接发给别人。
(3)Get方式URL数据格式。服务端文件名后跟着“?”,由于客户端可能向服务器端提交多个键值对,键值对之间用“&”进行分割,如果URL中有汉字、特殊符号等,则需要对URL进行编码。
(4)表单域只有设定了name的才会被提交给服务器(用get方式看的清楚)。如果给submit按钮设定name,那么按钮的value也会被提交给服务器
(5)【刷新】。

Request其它成员

(1)Request.UrlReferrer: 请求的来源,可以根据这个判断从百度搜的哪个关键词、防下载盗链、防图片盗链,可以伪造(比如迅雷)。“英莱特独有”,在进行测试。全局防盗链用Globals.asax
(2)Request.UserHostAddress:获得访问者的IP地址
(3)Request.Cookies :获取浏览器发过来的浏览器端的Cookie,从它里面读取Cookie值,比如context.Request.Cookies[“mysessionid”],使用Request.Cookies 的时候只是读取,将Cookie写回浏览器要用Response.Cookies
(4)Request.MapPath(virtulPath):将虚拟路径转换为磁盘上的物理路径,Request.MapPath("~/a/b.aspx")就会得到D:\2008\WebSites\WebSite4\a\b.aspx

Response其它成员

响应的缓冲输出:为了提高服务器的性能,ASP.Net向浏览器Write的时候默认并不会每Write一次都会立即输出到浏览器,而是会缓存数据,到合适的时机或者响应结束才会将缓冲区中的数据一起发送到浏览器。
(1)Response.Buffer、Response.BufferOutput:经过Reflector反编译,发现两个属性是一样的,Buffer内部就是调用的BufferOutput。这个属性用来控制是否采用响应缓存,默认是true。
(2)Response.Flush():将缓冲区中的数据发送给浏览器。这在需要将Write出来的内容立即输出到浏览器的场合非常适用。案例:大批量数据的导入,显示正在导入第*条数据,用Thread.Sleep模拟耗时。
(3)Response.Clear():清空缓存区中的数据,这样在缓存区中的没有发送到浏览器端的数据被清空,不会被发送到浏览器。
(4)Response.ContentEncoding:输出流的编码。
(5)Response.ContentType :输出流的内容类型,比如是html(text/html)还是普通文本(text/plain)还是JPEG图片(image/JPEG)。
(6)Response.Cookies: 返回给浏览器的Cookie的集合,可以通过它设置Cookie
(7)Response.OutputStream :输出流,在输出图片、Excel文件等非文本内容的时候要使用它
(8)Response.End(): 终止响应,将之前缓存中的数据发给浏览器,End()之后的代码不会被继续执行,End方法里调用了Flush()方法。在终止一些非法请求的时候,比如盗链等可以用End()立即终止请求。
(9)Response.Redirect(url): 重定向浏览器到新的网址。即可以重定向到站外网址也可以重定向到站内网址。Response.Redirect(“http://www.yltedu.com”)、Response.Redirect(“a.htm”)。Redirect是向浏览器发回302重定向(还有一个Location告诉浏览器要重定向到哪个页面),是通知浏览器“请重新访问url这个网址”,这个过程经历了服务器通知浏览器“请重新访问url这个网址”和浏览器接到命令访问新网址的过程。使用HttpWatch查看整个响应过程的Http报文。用Redirect因为是浏览器自己去重新访问新网址的,所以在地址栏中是可以看到网址的变化的。后面会用来防止刷新浏览器时提示“重试”。
(10)Response.SetCookie(HttpCookie cookie),向输出流中更新写到浏览器中的Cookie,如果Cookie存在就更新不存在就增加。是对Response.Cookies的简化调用。
(11)Response.Write():向浏览器输出内容。

三丶 ASP.NET WebForm和状态的保持

既然有了Ashx,为什么还要有Aspx?

模板引擎
凡是向服务器请求非HTML资源的功能,都应该交给一般处理程序来处理(ashx);如果客户想看到html页面,这时候我们就应该使用aspx会方便很多。
(1)如果每次输出网页都 一般处理程序(ashx) 的话太痛苦了,所以一般生成html的时候都直接创建aspx(Web窗体,WebForm)
(2)WebForm分为两个文件aspx和aspx.cs,aspx是页面模板,是页面描述文件,就是html+js+css的内容,和aspx.cs结合的更好,不用像一般处理程序那样程序员自己去输出HTML字符串或读取填充模板,控件都是定义在aspx中,内联的JavaScript、CSS也是写在aspx中的,服务端的C#代码是定义在aspx.cs中。aspx控制页面长相,cs控制程序逻辑,这种“前aspx后cs”的方式就被称为CodeBehind(代码后置-为什么要后置?)。

WebForm

前台文件和后台文件在运行的时候是两个分开的类—前台文件类 继承于 后台文件类。

(1)cs可以调用aspx中的runat=server的控件(根本原因),aspx中也可以访问cs中定义的非私有的成员(根本原因),还可以编写复杂的C#代码, for等所有C#代码都可以写在aspx中(不推荐)
(2)前面 <%=UserName %> <%=SayHello(); %> <%if (UserName == “aaa”) { UserName = “bbb”; } %> 后面
(3)在当前位置输出表达式的值的时候使用<%=UserName %>,不要丢了=,相当于在当前位置调用Response.Write(UserName)
(4)使用的函数、代码相当于在这个位置调用函数、执行代码。注意aspx中调用cs的只能是非私有成员(非private修饰-因为继承关系)
(5)<%%>中的代码是运行在服务器端的,是C#语法,在服务端运行完成才输出到浏览器,其他部分是运行在浏览器端的,是html、JavaScript语法。

aspx、cs、dll之间的关系(*)

(1)在WebForm的页面中执行代码Response.Write(this.GetType() + “”);在执行网站时,会被编译成相应的程序集(dll文件),这些dll文件可以通过以下代码查看,默认保存在C盘中.Response.Write(this.GetType().Assembly.Location + “
”);
(2)发现当前执行页面的类名是ASP.webform1_aspx这样的类名,父类才是ASPNETTest1.WebForm1
(3)使用Reflector打开这个临时dll,反编译这两个类,发现ASPNETTest1.WebForm1是在VS中编写的aspx.cs类,而ASP.webform1_aspx则是一个继承自ASPNETTest1.WebForm1的子类,ASP.webform1_aspx代码是根据aspx内容动态生成的构建网页内容的类。综上,aspx最终也会生成一个类,这个类是继承自aspx.cs中的类。查看反编译以后的代码,可以看到就是编译生成了普通的.Net 代码。因为aspx生成的代码是cs类的子类,所以就明白了为什么“aspx中调用cs的成员级别必须是protected或者public,不能是private的。”

aspx和ashx

(1)aspx和ashx关系:aspx就是一个特殊的ashx,微软在aspx中帮我们封装了很多操作,我们可以“傻瓜”化的进行开发。
(2)aspx和JavaScript和css混合写。
(3)浏览器如果报错“***行错误”(js脚本错误),不要看aspx,要看生成的源代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值