……

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

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

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

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

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

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

响应报文格式:

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

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

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

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

private void btnStart_Click(object sender, EventArgs e)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse(txtIP.Text), Convert.ToInt32(txtPoint.Text));
            socket.Bind(ip);
            socket.Listen(10);
            this.btnStart.Enabled = false;
            Task.Factory.StartNew(o =>              //启动一个线程来监听浏览器的请求
            {
                Socket serverSocket = o as Socket;
                while (true)
                {
                    Socket clientSocket = serverSocket.Accept();
                    byte[] data = new byte[1024 * 1024];
                    int len = clientSocket.Receive(data, 0, data.Length, SocketFlags.None);   //获取接受到的字节长度
                    if (len <= 0)
                    {
                        clientSocket.Shutdown(SocketShutdown.Both);
                        clientSocket.Close();
                        continue;
                    }

//我们在这里拿到了浏览器的请求报文,下面我们输出一下这个报文,看看他是不是上面所诉的格式

string strRequest = Encoding.UTF8.GetString(data, 0, len);

//要发送会浏览器的数据,socket通信要以byte类型的数据传输,这里也可以使html、图片、jss等静态的文件
                    byte[] sendText = Encoding.UTF8.GetBytes("这是服务器发送回去的数据!\r\n这是浏览器请求过来的报文\r\n" + strRequest);
 
                    //响应报文
                    string sendData = string.Format(@"HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/plain; charset=UTF-8
Server: Microsoft-IIS/8.0
X-Powered-By: ASP.NET
Date: Fri, 06 Sep {0}
Content-Length: {1}
 
", DateTime.Now, sendText.Length);
 
                    clientSocket.Send(Encoding.UTF8.GetBytes(sendData)); //发送响应报文
                    clientSocket.Send(sendText);        //这是响应报文的一部分 ---- 响应正文
                    clientSocket.Shutdown(SocketShutdown.Both);     //这样就进行了一次请求处理的过程,结束掉这个socket
                    clientSocket.Close();
                }
            }, socket);
        }

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

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管道处理动态资源文件。

[置顶] Asp.Net底层原理(一、浏览器和服务器的交互原理)的更多相关文章

  1. [置顶] Asp.Net底层原理(二、写自己的Asp.Net框架)

    我们介绍过了浏览器和服务器之间的交互过程,接下来介绍Asp.net处理动态请求. 写自己的Asp.Net框架,我们不会引用System.Web这个程序集,我们只需要创建要给自己的类库,所以在接下来的程 ...

  2. 方法控件[置顶] Asp.net总结(一)

    本文朋友在青岛逛街的时候突然想到的...这两天就有想写几篇关于方法控件的博客,所以回家到之后就奋笔疾书的写出来发表了 纵观 Asp.net的学习只会之路,可以发现 Asp.net可以分为以下几大块 控 ...

  3. JAVAEE 和项目开发(第一课:浏览器和服务器的交互模式和HTTP协议的概念和介绍)

    互联网的发展非常迅速,但是万变不离其宗.学习 web 开发,需要我们对互 联的交互机制有一定的了解.为了更好的理解并掌握 Servlet,在正式学习 Servlet之前需要对 web 开发中客户端和服 ...

  4. [置顶] ASP.Net中服务器控件的生命周期

    (1)初始化:在此阶段中,主要完成两项工作:一.初始化在传入Web请求生命周期内所需的设置;二.跟踪视图状态.首先,页面框架通过默认方式引发Init事件,并调用OnInit()方法,控件开发人员可以重 ...

  5. [置顶] ASP.NET MVC - Model Binding

    Http Request 到Input Model的绑定按照model的类型可分为四种情况. Primitive type Collection of primitive type Complex t ...

  6. [置顶] asp.net(c#)中相对路径(虚拟路径)和物理磁盘路径的转换

    物理路径就是磁盘路径,也就是说是在磁盘上的位置,虚拟路径也就是web页面上的路径,是相对于应用程序而言的 /// <summary> /// 将物理路径转换成相对路径 /// </s ...

  7. [置顶] js操作iframe兼容各种浏览器

    在做项目时,遇到了操作iframe的相关问题.业务很简单,其实就是在操作iframe内部某个窗体时,调用父窗体的一个函数.于是就写了两个很简单的htm页面用来测试,使用网上流行的方法在谷歌浏览器中始终 ...

  8. [置顶] Asp.Net---css样式的使用方式

    Css样式的使用大致分为三种 咱们先来看看一张总括图 1 使用连接的形式调用 有两种发方式调用: A   使用link标签 将样式规则写在.Css的样式文档中,再以<link>标签引入 如 ...

  9. CGI浏览器与服务器的交互

    一直在做项目,跟着写前端后端,却没有思考一个问题:前端和后端为什么能够进行通信?为什么能够将HTML页面的内容传输给后台,然后又将结果反馈给前端? 寒假偶尔看到了这个问题,也解决了我的疑惑,这是基于C ...

随机推荐

  1. Linux学习之chage命令

    功能:修改帐号和密码的有效期限用法:chage[-l][-m mindays][-M maxdays][-I inactive][-E expiredate][-W warndays][-d last ...

  2. 07-2. A+B和C (15)

    给定区间[-231, 231]内的3个整数A.B和C,请判断A+B是否大于C. 输入格式: 输入第1行给出正整数T(<=10),是测试用例的个数.随后给出T组测试用例,每组占一行,顺序给出A.B ...

  3. 为SQL Server 增加链接到SQL Server 的链接服务器

    整体的分析一下好有一个思路.我们的目的是完成一个到远程服务器的链接. 第一:我们要知道这台服务器在哪(也就是要知道它的IP地址,如果是在同一个网络中知道它的计算机名也是可以的.因为一台服务器上可以安装 ...

  4. 组合框里添加复选框的方法(使用勾选的假象,用图片代替而已,并非QT原生支持)

    组合框可以看作是列表框和文本框的组合,因其占据的空间少,使用操作方便,常被界面设计人员用于界面开发设计中,在有限个输入的条件下,组合框常用来代替文本框,这样从用户使用角度来看,更趋人性化,所见即所得. ...

  5. CVTE 一面

    在网上做完了测评之后,当天就收到面试的通知了,CVTE效率真高.第二天就去参加面试,面试前紧张了一把,后来去到之后发现只有几个应聘者,很多面试官前面都没人,估计现在中午一点,所以都去吃饭了.我和一个同 ...

  6. 51nod 1239 欧拉函数之和(杜教筛)

    [题目链接] https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 [题目大意] 计算欧拉函数的前缀和 [题解] 我们 ...

  7. hdu 4741 Save Labman No.004(2013杭州网络赛)

    http://blog.sina.com.cn/s/blog_a401a1ea0101ij9z.html 空间两直线上最近点对. 这个博客上给出了很好的点法式公式了...其实没有那么多的tricky. ...

  8. Android学习路线(二十)运用Fragment构建动态UI

    要在Android系统上创建一个动态或者多面板的用户界面,你须要将UI组件以及activity行为封装成模块.让它可以在你的activity中灵活地切换显示与隐藏. 你可以使用Fragment类来创建 ...

  9. SSO 基于Cookie+fliter实现单点登录(SSO):工作原理

    SSO的概念: 单点登录SSO(Single Sign-On)是身份管理中的一部分. SSO的一种较为通俗的定义是:SSO是指訪问同一server不同应用中的受保护资源的同一用户,仅仅须要登录一次,即 ...

  10. ImageMagick 转换 progressive jpeg

    什么是渐进式图片(Progressive JPEG)? 来自 张鑫旭-鑫空间-鑫生活 的解释: 不知诸位有没有注意到,这些jpg格式的图片在呈现的时候,有两种方式,一种是自上而下扫描式的,还有一种就是 ...