Asp.Net底层原理(一、浏览器和服务器的交互原理)_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > Asp.Net底层原理(一、浏览器和服务器的交互原理)

Asp.Net底层原理(一、浏览器和服务器的交互原理)

 2013/9/14 17:46:19  依然丶  博客园  我要评论(0)
  • 摘要:……一、浏览器和服务器的交互原理二、写自己的"迷你"Asp.net框架三、Asp.Net的请求与响应过程1、在此之前,首先简单的模拟一下我们去请求一个网址的时候,浏览器和服务器都做了些什么事情:我们请求一个网站的时候,浏览器会封装一个请求报文,发送至服务器,服务器会拿到浏览器的请求报文,进行分析处理,生成响应报文和处理生成后的html或者文本图片等,以流的方式返回给浏览器,浏览器会解析服务器返回的数据,把html、图片、js、css等呈现在浏览器中
  • 标签:.net ASP.NET net 浏览 浏览器 服务器 服务

……

 

一、浏览器和服务器的交互原理

二、写自己的"迷你"Asp.net框架

三、Asp.Net的请求与响应过程

 

     1在此之前,首先简单的模拟一下我们去请求一个网址的时候,浏览器和服务器都做了些什么事情:

                      

            我们请求一个网站的时候, 浏览器会封装一个请求报文,发送至服务器,服务器会拿到浏览器的请求报文,进行分析处理,生成响应报文和处理生成后的html或者文本图片等,以流的方式返回给浏览器,浏览器会解析服务器返回的数据,把html、图片、jscss等呈现在浏览器中。他们之间的通信都遵循了Http协议,顾名思义,HTTP协议就是定义服务器端和客户端之间文件传输的沟通方式,规定了一系列请求响应的格式,我们称为 Http请求报文(浏览器向服务器发送请求的数据格式)Http响应报文(服务器返回给浏览器的数据格式)

 

                               一个Http请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下面是请求报文的一般格式:

 

 

响应报文格式:

HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。

如下所示,HTTP响应的格式与请求的格式十分类似:

 

接下来,我们来演示一下通过Socket通信来理解Http协议:

 

创建一个winform程序,设置Ip和端口,开启服务时候,来监听Http请求。 

 

 1         private void btnStart_Click(object sender, EventArgs e)
 2         {
 3             Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 4             IPEndPoint ip = new IPEndPoint(IPAddress.Parse(txtIP.Text), Convert.ToInt32(txtPoint.Text));
 5             socket.Bind(ip);
 6             socket.Listen(10);
 7             this.btnStart.Enabled = false;
 8             Task.Factory.StartNew(o =>              //启动一个线程来监听浏览器的请求
 9             {
10                 Socket serverSocket = o as Socket;
11                 while (true)
12                 {
13                     Socket clientSocket = serverSocket.Accept();
14                     byte[] data = new byte[1024 * 1024];
15                     int len = clientSocket.Receive(data, 0, data.Length, SocketFlags.None);   //获取接受到的字节长度
16                     if (len <= 0)
17                     {
18                         clientSocket.Shutdown(SocketShutdown.Both);
19                         clientSocket.Close();
20                         continue;
21                     }
22                     //我们在这里拿到了浏览器的请求报文,下面我们输出一下这个报文,看看他是不是上面所诉的格式
23 
24                     string strRequest = Encoding.UTF8.GetString(data, 0, len);      
25  
26                     //要发送会浏览器的数据,socket通信要以byte类型的数据传输,这里也可以使html、图片、jss等静态的文件
27                     byte[] sendText = Encoding.UTF8.GetBytes("这是服务器发送回去的数据!\r\n这是浏览器请求过来的报文\r\n" + strRequest);
28  
29                     //响应报文
30                     string sendData = string.Format(@"HTTP/1.1 200 OK
31 Cache-Control: private
32 Content-Type: text/plain; charset=UTF-8
33 Server: Microsoft-IIS/8.0
34 X-Powered-By: ASP.NET
35 Date: Fri, 06 Sep {0}
36 Content-Length: {1}
37  
38 ", DateTime.Now, sendText.Length);
39  
40                     clientSocket.Send(Encoding.UTF8.GetBytes(sendData)); //发送响应报文
41                     clientSocket.Send(sendText);        //这是响应报文的一部分 ---- 响应正文
42                     clientSocket.Shutdown(SocketShutdown.Both);     //这样就进行了一次请求处理的过程,结束掉这个socket
43                     clientSocket.Close();
44                 }
45             }, socket);
46         }

 

  

这样我们就做好了监听浏览器请求的小服务器,当浏览器请求过来,发送一个响应报文给浏览器,浏览器接受请求报文并解析呈现。

 

 

ncoding.UTF8.GetBytes("这是服务器发送回去的数据!\r\n这是浏览器请求过来的报文\r\n" + strRequest);

byte[] sendText = clientSocket.Send(sendText);

这里还可以把图片、静态html文件等以byte数组的形式发送到响应流中,需要做的还有响应报文中的Content-Type:需要改为

"image/png"或者text/html;charset=UTF-8这样的类型。

 

---------------------------------------------

 

下面我们介绍,在实际应用中,浏览器和服务器之间的交互是怎样的。

 

IIS6的介绍:

 

HTTP.SYS:是一个网络驱动程序,他始终处于运行状态,负责监听http请求。

  W3SVC创建、回收、监控工作进程。

          Metabase:存储配置信息。

Aspnet_isapi.dll:  CLR的加载、应用程序域的创建和web应用的初始化。

 

 

 

浏览器封装请求报文到IIS-->

IIS监听到浏览器的请求 -->

IIS将请求分发给 W3SVC服务 -->

W3SVC根据Metabase获取对应的目标应用的工作进程 -->      --如果是静态文件则原路返回

工作进程W3WP.EXE利用aspnet_isapi.dll加载.newFramework处理动态资源

 

 

 

到这里,IIS如果发现是静态资源,会直接返回,那么我们刚才模拟的服务器程序稍作修改就可以实现。那么对于动态程序不是就shit了么!

Request.QeuryString[]Response.Write()、使用html模板、扩展HttpModule、创建一般处理程序这些基本的处理方式怎么办!?

          在下个文章中,我们来模拟ASP.NET管道处理动态资源文件。

发表评论
用户名: 匿名