随着网络技术的发展,Web服务器已经成为互联网基础设施的重要组成部分。本文将介绍如何开发一个简易的Web服务器,它能够处理GET和POST请求,并且适用于需要提供特定网页的场景,例如新闻聚合器。
简易Web服务器在多种应用场景中非常有用,尤其是当需要提供专门的网页服务,而不需要ASP.NET应用的开销时。例如,新闻聚合器就是一个典型的例子,它只需要提供一个包含当前新闻源的单一页面。
应用户要求,增加了对POST命令的处理。
应用程序的核心是TinyServer类,它提供了一个简单的Web服务器,仅支持GET请求(不支持表单)并从目录中提供网页。要运行示例Web服务器,需要构建WebServer项目并配置其设置:
WebRoot: "E:\src\DotNet\WebServer\root"
DefaultPage: "default.html"
TemplatePath: "E:\src\DotNet\WebServer\html"
Port: 81"
LogFile: ""
LogLevel: "All"
一旦WebServer应用程序启动,它会实例化TinyServer并调用Run()方法。这将在一个单独的线程中启动服务器。调用Stop()方法将终止该线程。
可能想要构建自己的Web服务器版本。需要继承TinyServer类,然后覆盖必要的函数。最重要的是覆盖doGet()方法。在这个方法中,可以查询GET命令并返回所需的任何内容。
protected virtual void doGet(string argument)
{
string url = getUrl(argument);
if (url.StartsWith("/"))
url = url.Substring(1);
if (url.Length == 0)
url = defaultPageName;
string path = Path.Combine(webRootPath, url);
if (File.Exists(path))
{
sendOk();
sendfile(path);
}
else
sendError(404, "File Not Found");
}
要处理POST命令,有一个doPost函数可以覆盖。目前,它的作用非常有限:
protected virtual void doPost(string argument, string Content)
{
log(LogKind.Informational, "Post Data: '{0}'", Content);
sendOk();
}
如所见,POST的内容可以作为字符串获取。要实现版本,可以使用一些实用函数:
为了展示这种能力,编写了一个简单的新闻聚合器,它定期从源下载RSS源。
RSS聚合器执行两个操作:
第一部分使用了由smallguy78创建的RssReader类。它在自己的线程中运行,当前副本超过一小时后将下载源。第二部分由一个名为AggServer的TinyServer子类实现。AggServer只返回一个包含新闻源摘要和文章链接的页面。因此,doGet()非常简单:
protected override void doGet(string argument)
{
this.sendOk();
this.sendString(writeLinkPage());
}