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

  • 相关阅读:
    JasperReport
    Linux
    Linux
    Linux
    Linux
    Groovy
    Linux
    VS
    Aliyun
    Linux
  • 原文地址:https://www.cnblogs.com/Tan-sir/p/4682659.html
Copyright © 2020-2023  润新知