1.1.HTTP协议
浏览器与WEB服务器的协议是应用层协议,当前遵循HTTP/1.1,HTTP协议是无状态的协议
客户机与服务器通过请求和响应完成一次会话(Session),每次会话中,双方发送的数据称为消息(Message),消息分为两种:
请求消息和回应消息。
客户端请求消息
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。
服务器响应消息
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
与程序员相关的主要有两个层:传输层和应用层。
传输层协议负责解决数据的传输问题,传输层依赖更低层的网络层完成实际数据传输,在 TCP/IP 网络协议中,负责可靠通信的传输层协议为 TCP 协议。而网络层一般由网络驱动来实现,普通程序员不涉及;TCP/IP 协议中,网络层的协议为 IP 协议。
1.2 最简单的 Web 服务器
1.2.1 网络插座 Socket
使用 Socket 开发程序时,首先考虑使用的网络类型,主要三方面:
- Socket 类型,使用网络协议的类别,IPv4 的类型为 PE_INET
- 数据通信的类型,常见的数据报(SOCK_DGRAM)、数据流(SOCK_STREAM)
- 使用的网络协议,比如:TCP协议
在一个网络地址上,区分使用协议不同,分配一个数字,称为端口号(port)0~65535
- (0~1023)称为众所周知的端口,由 IANA(互联网地址分配机构)控制和分配,特定的网络程序使用。例如,TCP协议使用 80 端口完成 HTTP 协议传输。
- (1024~49151)称为登记端口,不由 IANA控制,但 IANA 维护一个登记列表。
- (49152~65535)称为动态或私有端口,由普通用户使用。
在.NET中,System.Net 提供网络编程的大多数数据类型以及常用操作
IPAddress 类表示一个 IP 地址
IPEndPoint 类表示一个 IP 地址和一个端口号的组合,称为网络的端点
System.Net.Sockets 命名空间中提供了基于 Socket 编程的数据类型
Socket 类封装了 Soket 的操作
常用:
Listen: 将 Socket 置于侦听状态,并设置等待队列的长度。
Accept:为新建连接创建新的 Socket。
Receive: 接收来自绑定的 Socket 的数据。
Send: 将数据发送到连接的 Socket。
1.2.2 基于 TcpListener 的 Web 服务器
为了简化基于 TCP 协议的监听程序,.NET 在 System.Net.Sockets 命名空间中提供了 TcpListener 类 ,使用它,在构造函数中传递一组网络端点信息就可以准备好监听参数,而不需要设置使用的网络协议细节,调用 Start方法后,监听开始。AcceptTcpClient 方法阻塞进程,直到一个客户端的连接到达经停气,这个方法返回一个代表客户端连接的代理对象,类型为 TcpClient,可以通过它与客户端进行通信。
1.2.3 基于 HttpListener 的 Web 服务器
为了进一步简化 HTTP 协议的监听器,System.Net 提供 HttpListener类。提供一系列相关对象封装 HTTP 的处理工作。这个类使用 Http.sys 系统组件完成工作,所以在 Windows XP SP2 或者 Server 2003 以上操作系统才能使用。(废话了,在用 WIN 2000 的在下佩服)
1.3 进入 ASP.NET
.NET中,程序集管理的最小逻辑单位为应用程序域(AppDomain),对.NET程序来说,可以动态加载程序集到应用程序域中。但是,加载之后的程序集不能单独卸载,只能以应用程序域来整体卸载。应用程序域提供四个重要的机制:
- 隔离
- 卸载
- 安全
- 配置
ASP.NET将网站应用程序寄宿在一个独立的应用程序域中,便于管理。虽然可以通过 System.AppDomain 可以创建自定义的应用程序域,但是,ASP.NET 在 System.Web.Hosting 命名空间中定义更加方便的辅助类,以协助程序员创建寄宿 Web 服务器程序所涉及的应用程序域并设置参数。
由于我们的应用程序将与 Web 应用程序运行在不同的应用程序域中,涉及跨域问题。.NET中跨域访问的类必须继承自 System.MarshalByRefObject,这样我们的管理程序将得到一个远程对象的代理对象,通过这个代理对象来访问 Web 应用程序域中的对象。
1.3.1 Web 应用程序域
ApplicationHost 类的静态方法 CreateApplicationHost 可以帮助我们非常简单的创建 Web 应用程序所需要的应用程序域并设置参数。
1.3.2 不使用 GAC 和 bin 加载 Web应用程序域
1.3.3 默默无闻的工作者对象 HttpWorkerRequest
准备用于处理的请求,必须封装为 HttpWorkerRequest 类型的对象,这是一个抽象类,定义在 System.Web 命名空间中
Public abstract class HttpWorkerRequest
通过这个类的实例,必须提供关于处理请求所需要的信息,以便服务器处理请求。
1.3.4 Web 应用程序的运行时 HttpRuntime
System.Web.HttpRuntime 类是整个 ASP.NET 服务器处理的入口。
1.4 对象化的 HTTP
1.4.1 请求参数的对象类型 HttpRequest
对于每一个请求参数,HttpRuntime 创建一个类型为 HttpReqeuest 对象实例,在System.Web 中。
这个类定义大量属性,表示关于 HTTP 请求参数。这些参数来源于 HttporkereRequest 。
1.4.2 处理回应的对象类型 HttpResponse
1.4.3 辅助的常用工具类 HttpServerUtility
1.4.4 编码与解码
1.HTML
HtmlEncode 编码,HtmlDecode 解码(一般浏览器完成)
2.URL
URL 串只应该出现 ASCII 字符。
UrlEncode 方法用来对URL 串进行编码
3.URL Path
UrlPathEncode 仅仅编码 URL 的 Path 部分
4.UrlToken
UrlTokenEncode 用于在 URL 中以字符串形式传递一个字节数组的时候使用
1.4.5 浏览器类型
在ASP.NET中,以 HttpBrowserCapabilities 类型对象的形式,通过 HttpRequest 提供给开发人员。
Public HttpBrowserCapabilities Browser { get; set; }