ASP.NET 高级编程基础第五篇—Http协议
前言: 在这篇博客中我主要讲述了Http协议的一些内容,因为我们开发的是基于网页(B/S)的引用程序开发,所以我们不得不和Http协议打交道,这篇博客就是我们初步学习如何和Http协议打交道的。
- HTTP协议
(1) web开发是和Http协议打交道的,必须了解Http协议,Http协议版本:Http/0.9,Http/1.0,Http/1.1,现在主流的都是Http/1.1版本
(2) Http协议分析工具
1) DebugBar,Http(s)标签的内容,免费的,只能分析当前浏览器中的内容。
2) HttpWatch,收费的,只能分析当前浏览器中的内容。
3) HttpAnalyzer,收费的,能分析计算机上所有的Http数据。
(3) Http协议的几个概念
1) 连接(Connection):浏览器和服务器之间传输数据的通道,一般请求完毕就关闭,不会保持连接。
2) 请求(Request):浏览器向服务器发送”我要……”的消息,包含请求的类型,请求的数据,浏览器的信息(语言,浏览器版本等)。
3) 响应(Response):服务器对浏览器的请求返回数据,包含是否成功,错误码等。
- HTTP请求报文
(1) 用HttpWatch查看访问一个网站(用Discu2n测试环境)的响应情况,敲入一个网址后,浏览器向服务器发出请求,页面中的JS,图片,CSS在单独的请求中。
(2) Get/Http/1.1表示向服务器用Get方式请求首页,使用Http/1.1协议。
(3) Accept-Encoding gzip,deflate表示浏览器支持gzip,deflate两种压缩算法。
(4) Accept-language zh-cn表示浏览器支持的语言,很多网站进入后就是自动就是中文界面的国际网站就是通过读取这个头的值来实现的。
(5) Connection keep-Alive。一般情况下,一旦Web服务器向浏览器发送了请求数据,他就要关闭TCP连接,然后如果浏览器或者服务器在其头信息中加入了Connection Keep-Alive,则TCP连接在发送后将任然保持打开状态,于是浏览器可以继续通过相同的连接发送请求,保持连接节省了为每个请求建立新连接所需要的时间,还节约了网络带宽。
(6) Cookie是浏览器向服务器发送和当前网站关联的Cookie,这样在服务器端也能读取到浏览器端的Cookie了。
(7) User-Agent为浏览器的版本信息,通过这个信息可以读取到浏览器是IE还是FireFox,支持的插件,.net版本等。
- HTTP响应码
(1) 浏览器向服务器发出请求,服务器处理可能会成功,可能会失败,可能没有权限访问,服务器会通过响应码来告诉浏览器处理结果。
1) “200”:OK 成功。
2) “301”: Moved Permanently 永久转移。
3) “302”:Found 暂时转移。
4) “307”:Tempoay Redirect。
5) “400”:Bad Request错误请求,发出错误的不符合Http协议的要求。
6) “401”:Unauthoried 未认证,一般需要用户名,密码登录。
7) “403”:Forbidden 禁止。
8) “404”:Not Found 未找到(*)。
9) “500”:Internal Server Error 服务器错误。
10) “503”:Server Unavailable:一般是访问人数过多。
(2) 200段是成功,300段需要对请求作进一步处理,400段表示客户端请求错误,500段表示服务器错误。
- 服务器返回的报文
(1) Server:Cassini/3.5,0.5表示服务器的类型。
(2) content-Type:text/html;Charset=utf-8表示返回数据的类型。
(3) 服务器通过content-type告诉客户端响应的数据类型,这样浏览器就根据返回数据的类型来进行不同的处理,如果是图片类型就显示,如果是文本类型就直接显示内容,如果是HTML类型就用浏览器显示内容,如果是下载类型就弹出下载工具等。
(4) 常用Content-Type:text/html,image/gif,image/jpeg,text/plain,text/javascript,application/x-excel,application/octet-stream(二进制文件)。
(5) Content-Length:19944表示后续数据消息体的长度,报文头只是描述,返回的具体数据(比如:Html文本,图片数据等)在两个回车之后的内容中。
- HTTP其他
(1) 网页中如果有图片,CSS,JS的报告外部文件的话,图片,CSS,JS都在单独的请求中,也就是并不是页面的所有内容都在一个请求中完成,而是每个资源一个请求。
(2) 一般情况下,只有浏览器请求服务器端,服务器端才会给浏览器响应数据,不会主动向浏览器推送数据,这样是安全考虑,也是提高服务器的性能考虑,如果要服务器向浏览器推送数据,则需要使用ServerPush等额外的技术。
(3) Http是”请求—响应”的工作方式,因此页面会不断刷新,如果不希望页面刷新则要使用Ajax技术。
- 请求响应模型的例子
(1)按钮实现表格删除的效果,使用超链接进行删除。
1) 新建一个html页面,起名为delete.htm,在建立一个一般处理程序,起名为delete.ashx,在其中写入代码如下:
1 context.Response.ContentType = "text/html"; 2 3 string name = context.Request["Name"]; 4 5 context.Response.Write(name + "被删除了");
在delete.htm页面中写入如下代码:
1 <form action="delete.ashx" id="form1" method="get"> 2 3 <input type="hidden" name="Name" id="Name" /> 4 5 <table> 6 7 <tr><td>姓名</td><td>年龄</td><td>操作</td></tr> 8 9 <tr><td>Tom</td><td>20</td> 10 11 <td><a href="delete.ashx?Name=tom">删除</a> 12 13 <!--<input />控件的作用是最先获取到Name的值,然后执行Form表单--> 14 15 <input type="button" value="删除" onclick="document.getElementById('Name').value='Tom';document.getElementById('form1').submit();" /></td> 16 17 </tr> 18 19 <tr><td>Jerry</td><td>30</td><td><a href="delete.ashx?Name=Jerry">删除</a></td></tr> 20 21 </table> 22 23 </form>
2) 在新建一个Web窗体页面,在其页面下面输入如下操作代码,在Page_Load中的代码是:
1 if (IsPostBack) 2 3 { 4 5 string name = Request["Name"]; 6 7 Response.Write(name + "被删除了"); 8 9 }
页面布局为:
1 <body> 2 3 <form id="form1" runat="server" method="post"> 4 5 <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 6 7 <input type="hidden" name="Name" id="Name" /> 8 9 <div> 10 11 <table> 12 13 <tr><td>姓名</td><td>年龄</td><td>操作</td></tr> 14 15 <tr> 16 17 <td>tom</td><td>20</td><td> 18 19 <input type="button" value="删除" onclick="document.getElementById('Name').value='tom';document.getElementById('form1').submit()" /> 20 21 <a href="javascript:document.getElementById('Name').value='tom';document.getElementById('form1').submit()">删除</a> 22 23 </td> 24 25 </tr> 26 27 <tr><td>Jerry</td><td>30</td><td><a href="Delete.aspx?Name=Jerry">删除</a></td></tr> 28 29 </table> 30 31 </div> 32 33 </form> 34 35 </body>
(2) 这就是asp.net中数据绑定控件中行按钮和行超链接实现方式的不同,ListView中Button,HyperLink两种行删除的方式,按钮方式是将行的Id通过表单提交到服务器,行超链接的方式是通过超链接的URL通过get方式提交给处理页面,超链接的方式由于没有提交所有的表单信息,因此很多服务器端控件的高级用法用不了。
(3) 用aspx重写,超链接的因为没有向服务器提交viewState等隐藏字段,所以处理时IspostBack是false,而按钮的则是提交了表单,所以IsPostBack=True,可以在超链接的Href中写表单提交的JavaScript,这样就是WebForm中的LinkButton的原理。
(4) 客户端,服务器由于在两台计算机中,所以无法做到两边的变量的互相读取或者两边函数的互相调用,所以如果相看起来好像做到,那么必须通过提交的方式来将客户端变量值作为一个表单字段提交到服务器,或者服务器端将服务端变量打印到客户端代码中。
注释:Http协议我们就说到这里了,下节博客是wen开发的一些基本原则,希望我们共同来学习,我们的群号是:159227188,欢迎大家在这里交流。
初心商城:初心商城
作者:韩迎龙(Kencery) MVC/.NET群:159227188如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏一杯咖啡,本页版权归作者和博客园所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利