|
为了进一步简化HTTP协议的监听器,.NET在命名空间System.Net中提供了HttpListener类。伴随这个对象,.NET提供了一系列相关对象封装了HTTP的处理工作。注意,这个类使用Http.sys系统组件完成工作,所以,只有在WindowsXPSP2或者Server2003以上的操作系统中才能使用。
HttpListener类进一步简化了监听操作,仅需通过字符串的方法提供监听的地址、端口号以及虚拟路径,就可以开始监听工作。
开始监听后,GetContext方法将阻塞线程,当客户端的请求到达之后,HttpListener返回一个HttpListenerContext对象作为处理客户端请求的总代理,通过代理对象的Request属性,我们可以得到一个类型为HttpListenerRequest的代表请求参数的对象,这个对象将大多数请求参数进行了对象化,所以,我们可以通过它提供的一系列属性来获取请求参数。例如HttpListenerRequest的HttpMethod属性就提供了请求的方法类型。通过代理的Response属性,可以得到一个类型为HttpListenerResponse的回应处理对象,这个对象将回应的数据和操作进行了封装,使得我们大幅度简化了回应的编程工作量,工作过程如下所示:
//检查系统是否支持
if (!HttpListener.IsSupported)
{
throw new System.InvalidOperationException(
" 使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
}
// 注意前缀必须以 / 正斜杠结尾
string[] prefixes = new string[] { "http://localhost:49152/" };
// 创建监听器.
HttpListener listener = new HttpListener();
// 增加监听的前缀.
foreach (string s in prefixes)
{
listener.Prefixes.Add(s);
}
// 开始监听
listener.Start();
Console.WriteLine(" 监听中...");
while (true)
{
// 注意: GetContext 方法将阻塞线程,直到请求到达
HttpListenerContext context = listener.GetContext();
// 取得请求对象
HttpListenerRequest request = context.Request;
Console.WriteLine("{0} {1} HTTP/1.1", request.HttpMethod, request.RawUrl);
Console.WriteLine("Accept: {0}", string.Join(",", request.AcceptTypes));
Console.WriteLine("Accept-Language: {0}",
string.Join(",", request.UserLanguages));
Console.WriteLine("User-Agent: {0}", request.UserAgent);
Console.WriteLine("Accept-Encoding: {0}", request.Headers["Accept-Encoding"]);
Console.WriteLine("Connection: {0}",
request.KeepAliv e ? "Keep-Alive" : "close");
Console.WriteLine("Host: {0}", request.UserHostName);
Console.WriteLine("Pragma: {0}", request.Headers["Pragma"]);
// 取得回应对象
HttpListenerResponse response = context.Response;
// 构造回应内容
string responseString
= @"<html>
<head><title>From HttpListener Server</title></head>
<body><h1>Hello, world.</h1></body>
</html>";
// 设置回应头部内容,长度,编码
response.ContentLength64
= System.Text.Encoding.UTF8.GetByteCount(responseString);
response.ContentType = "text/html; charset=UTF-8";
// 输出回应内容
System.IO.Stream output = response.OutputStream;
System.IO.StreamWriter writer = new System.IO.StreamWriter(output);
writer.Write(responseString);
// 必须关闭输出流
writer.Close();
if (Console.KeyAvailable)
break;
}
// 关闭服务器
listener.Stop();
在使用HttpListener的时候,常用的请求和回应参数都变成了对象的属性,大幅度降低了编程的工作量。但是,大多数的参数还是需要通过Headers索引器来访问的,就像上例中的Accept-Encoding请求参数,我们就不能直接通过属性访问。 |
上一篇:css文件和js文件后面带一个问号下一篇:美好的一天开始啦!!大家加油啊
|