ASP.NET本质论开篇

ASP.NET本质论开篇

一个用户(Client)在浏览器上输入一个网址http://www.cnblogs.com/meat,然后我们就可以见到到了一个可爱的页面。这背后发生了什么呢?相信大部分看官都已经知道了。整个流程如下:

   1. 浏览器通过URL找到博客园的Web服务器并把请求信息参数化传递上去

   2. Web服务器接收到来自浏览器的请求后经过一系列的处理会回应一个输出流给浏览器

   3. 浏览器接收并解析Web服务器端返回的数据,如果遇到需要请求图片或者js、css文件的情况下

       会在反复执行1、2、3步骤。

   4. 解析完成。


如图中Http Reqauest其实不怎么准确,因为有些时候它也会包含Content,这是要看请求是什么类型的,如果是GET就不需要,而POST则会把请求参数放在Content中。

下面将演示自定义一个简单ASP.NET 服务器,其实功能上就是最简化的IIS。通过监听Web服务器上的端口,然后相应浏览器端的请求,最后把服务器端把响应信息传回浏览器端.

public void Run()
        {
            // 取得本机的 loopback 网络地址,即 127.0.0.1
            IPAddress address = IPAddress.Loopback;            // 创建可以访问的端点,49152 表示端口号
            IPEndPoint endPoint = new IPEndPoint(address, 49152);     
            // 创建一个 socket,使用 IPv4 地址,传输控制协议 TCP,双向、可靠、基于连接的字节流
            Socket socket = new Socket(
                AddressFamily.InterNetwork,
                SocketType.Stream,
                ProtocolType.Tcp);            // 将 socket 绑定到一个端点上
            socket.Bind(endPoint);            // 设置连接队列的长度
            socket.Listen(10);
            while (true)
            {
               // 开始监听,这个方法会阻塞线程的执行,直到接受到一个客户端的连接请求
                Socket client = socket.Accept();                // 输出客户端的地址
                Console.WriteLine(client.RemoteEndPoint);                // 准备读取客户端请求的数据,读取的数据将保存在一个数组中
                byte[] buffer = new byte[4096];                // 接受数据
                int length = client.Receive(buffer, 4096, SocketFlags.None);
                // 将请求的数据翻译为 UTF-8
                System.Text.Encoding utf8 = System.Text.Encoding.UTF8;                string requestString = utf8.GetString(buffer, 0, length); 
                // 显示请求的内容
                Console.WriteLine(requestString);              
                // 状态行
                string statusLine = "HTTP/1.1 200 OK\r\n";                byte[] statusLineBytes = utf8.GetBytes(statusLine);                // 准备发送到客户端的网页
                string responseBody 
                    = @"<html>
                            <head><title>From Socket Server</title></head>
                            <body><h1>Hello, world.</h1></body>
                        </html>";                byte[] responseBodyBytes = utf8.GetBytes(responseBody);                // 回应的头部
                string responseHeader =                    string.Format(                        "Content-Type: text/html; charset=UTF-8\r\nContent-Length: {0}\r\n",
                        responseBody.Length
                        );                byte[] responseHeaderBytes = utf8.GetBytes(responseHeader);                // 向客户端发送状态信息
                client.Send(statusLineBytes);                // 向客户端发送回应头
                client.Send(responseHeaderBytes);                // 头部与内容的分隔行
                client.Send(new byte[] { 13, 10 });                // 向客户端发送内容部分
                client.Send(responseBodyBytes);                // 断开与客户端的连接
                client.Close();                if (Console.KeyAvailable)                    break;
            }            // 关闭服务器
            socket.Close();
        }

运行效果如下:

客户端:

服务器端接收到请求后:

因此从本质上讲,ASP.NET 本身就是一个网络服务程序。这个服务程序通过HTTP现已与客户端进行通信,响应客户端发出的请求,并回应处理结果。

欢迎大家添加我的个人微信公众号:

或者搜索微信公众号:FreshManIT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值