ASP.NET Web基本原理
ASP.NET Web基本原理
浏览器与服务器之间的交互
浏览器向服务器发送HTTP请求,具体如下:
1.浏览器向服务器发送TCP包,要求服务器打开连接
TCP包首部32位,占20字节,格式如图一:
图一:TCP首部(画图工具不太熟悉O,O)
2.服务器应答浏览器,连接已开通。
3.浏览器发送一个HTTP的GET(POST)请求。
服务器返回HTML代码,浏览器解析页面。如果遇到IMG标签,浏览器就向服务器发送请求,请求该图片。
例如:用户访问百度网http://www.baidu.com/
1.浏览器向DNS的Web数据库请求http://www.baidu.com/的Ip:125.125.0.0(随便写的一个B类)
2.浏览器与125.125.0.0进行TCP连接,端口号:80(默认端口。每个服务器软件监听一个端口,一个服务器端口也只能被一个服务器软件监听)
3.浏览器执行HTTP
4.服务器返回HTML
5释放TCP连接
6.解析HTML页面
浏览器代码
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Net; 5 using System.Net.Sockets; 6 using System.Text; 7 using System.Threading.Tasks; 8 using System.IO; 9 10 namespace 浏览器原理 11 { 12 class Program 13 { 14 static void Main(string[] args) 15 { 16 Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp);//TCP、UDP。 17 socket.Connect(new DnsEndPoint("127.0.0.1", 8022));//连接服务器。http协议默认的端口号是80。每个服务器软件监听一个端口(别的软件就不能监听这个端口了),发送给这个端口的数据只会被这个服务器软件接收到。请求服务器为本地服务器 18 using (NetworkStream netStream = new NetworkStream(socket))//读写socket通讯数据的流 19 using (StreamWriter write = new StreamWriter(netStream))//写入流 20 { 21 write.WriteLine("GET /index.html HTTP/1.1");//每一行指令都回车一下。注意:1)GET后要有空格;2)中文文件名需要进行url编码 22 write.WriteLine("Host: 127.0.0.1:8080"); 23 write.WriteLine();//空行回车,表示指令结束 24 } 25 using(NetworkStream netStream=new NetworkStream(socket)) 26 using (StreamReader reader = new StreamReader(netStream))//读出流 27 { 28 string line; 29 while ((line = reader.ReadLine()) != null) 30 { 31 Console.WriteLine(line); 32 } 33 34 } 35 socket.Disconnect(false);//断开通讯 36 Console.ReadKey(); 37 } 38 39 } 40 }
服务器代码:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace MyWeb服务器1 { class Program { static void Main(string[] args) { Socket serverSocket = new Socket(SocketType.Stream, ProtocolType.Tcp);//宿舍大妈 serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8080)); serverSocket.Listen(10); while (true) { Console.WriteLine("等着请求"); Socket socket = serverSocket.Accept();//男女通讯通道。返回大妈给你的这个人的通讯通道 Console.WriteLine("来了请求"); using(NetworkStream stream = new NetworkStream(socket)) using (StreamReader reader = new StreamReader(stream)) { string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); if (line.Length <= 0) { break;//遇到空行了,请求结束了不用再等了 //如果不break,就一直卡在ReadLine()等着浏览器发后续的数据 } } } using (NetworkStream stream = new NetworkStream(socket)) using(StreamWriter writer = new StreamWriter(stream)) { writer.WriteLine("HTTP/1.1 200 OK");//按照HTTP协议返回 writer.WriteLine(); writer.WriteLine("welcome to rupeng.com"); } socket.Disconnect(false);//断开通讯 } } } }
服务器和浏览器之间只进行沟通,沟通完成后,服务器浏览器断开连接。
HttpHandler
IHttpHandler在MSDN中的定义:使用自定义的HTTP处理程序同步处理HTTP Web请求而实现的协定。
HttpHandler(页面真正的处理)是asp.net真正处理Http请求的地方,并且在处理前和处理后会将处理后的信息附加在HTTP上,返回到HttpModule(用于页面处理前和处理后的一些事件的处理)中。
IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求。
IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,ashx等等)才会轮到调用它。
创建一般处理程序(类名:接口)实现IHttpHandler接口,当有用户请求时(先经过HttpModule),ProcessRequest方法被调用。
IsReusable:获取当前实例是否可用。
Response响应内容。
Request请求内容:ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pipeline中各个HttpModule的处理,最后将HTML发送到客户端浏览器中。
表单提交:Html表单通过<form>提交给服务器,当点击submit按钮的时候,<form>里面的内容就会提交到服务器。
<form>里面只有三类标签可以被提交:input,textarea,select。提交value值(标签必须设定name属性——服务器,id——Dom),当input=submit的时候,只有被点击的按钮(要有name)的value才会被提交。