使用beetle简单地实现高效的http基础服务

在这章会讲解Beetle实现一个比较通用的应用协议HTTP扩展.组件对于HTTP协 议的扩展也是一件非常简单的事情,同时也能得到组件出色的性能和稳定性所支持.不过在实现之前必须对HTTP协议组成部分有个大概的了解.HTTP协议主 要由两大部分组件分别是消息头和消息体,消息头是必须的有于描述获取相关内容和附带的一些属性如:GET /images/logo.gif HTTP/1.1,通过回车换行符来标记消息头结束.对于消息休则是可选的如果存在消息体必须在消息头里标识Content-Length.对于HTTP 更详细的内容可以查看http://zh.wikipedia.org/zh/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE
接下就详细讲述Beetle实现HTTP服务的过程,具体内容如下:
   制订对应的HTTP对象消息结构
   制订HTTP协议分析器
   实现一个HTTP服务并在浏览中访问
   性能测试
   总结
   制订HTTP对象消息
   既然HTTP协议由两大部分组成,那就可以根据这制订相应的协议对象
       消息头
 
   //http头描述
   public class HttpHeader : HttpMessage
   {
       public HttpHeader()
       {
           Headers = new Hashtable(8);
       }
       //消息头常量定义,详细参考http://en.wikipedia.org/wiki/List_of_HTTP_header_fields
       #region headers
       public const string HTTP_ContentLength = "Content-Length";
       public const string HTTP_Request_Accept = "Accept";
       public const string HTTP_Request_AcceptCharset = "Accept-Charset";
       public const string HTTP_Requst_AcceptEncoding = "Accept-Encoding";
       #endregion
       //获取http头键值表
       public Hashtable Headers
       {
           get;
           set;
       }
       //获取设置方法信息如GET /images/logo.gif HTTP/1.1或返回信息
       public string MethodInfo { get; set; }
       //获取或设置消息休长度
       public int ContentLength
       {
           get
           {
               object value = Headers[HTTP_ContentLength];
               if (value != null)
                   return int.Parse(value.ToString().Trim());
               return 0;
           }
           set
           {
               Headers[HTTP_ContentLength] = value.ToString();
           }
       }
       public string this[string key]
       {
           get
           {
               return (string)Headers[key];
           }
           set
           {
               Headers[key] = value;
           }
       }
   }
       消息体
   
   //消息体数据块
   public class HttpDataSegment : HttpMessage
   {
       public HttpDataSegment()
       {
           Data = HttpPackage.BufferPools.Pop();
           Data.SetInfo(0, 0);
       }
       //当前块是否尾部
       public bool Eof
       {
           get;
           set;
       }
       //获取数据块内容
       public ByteArraySegment Data
       {
           get;
           set;
       }
       //释放数据块对应的buffer
       protected override void OnDispose()
       {
           base.OnDispose();
           if (Data != null)
           {
               HttpPackage.BufferPools.Push(Data);
               Data = null;
           }
       }
   }