在这章会讲解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;
}
}
}
发表回复