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才会被提交。

posted on 2015-07-28 23:18  Mr.Tan&  阅读(851)  评论(0编辑  收藏  举报

导航