简易Web服务器开发指南

随着网络技术的发展,Web服务器已经成为互联网基础设施的重要组成部分。本文将介绍如何开发一个简易的Web服务器,它能够处理GET和POST请求,并且适用于需要提供特定网页的场景,例如新闻聚合器。

简易Web服务器的应用场景

简易Web服务器在多种应用场景中非常有用,尤其是当需要提供专门的网页服务,而不需要ASP.NET应用的开销时。例如,新闻聚合器就是一个典型的例子,它只需要提供一个包含当前新闻源的单一页面。

更新(2013年7月)

应用户要求,增加了对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服务器

可能想要构建自己的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的内容可以作为字符串获取。要实现版本,可以使用一些实用函数:

  • getUrl(string argument):获取doGet的命令参数并提取URL。
  • string[] urlArgs:返回URL后继参数的列表。
  • sendOK():发送OK头;在发送任何HTML之前这是必要的。
  • sendError(int errornr, string errorMsg):发送错误而不是OK。
  • sendString(string):发送消息。
  • sendFile(path):发送整个文件。
  • sendTemplate(templateName):发送模板目录中的文件。

RSS聚合器示例应用程序

为了展示这种能力,编写了一个简单的新闻聚合器,它定期从源下载RSS源。

RSS聚合器执行两个操作:

  • 下载并保持更新选定的RSS源列表。
  • 运行一个Web服务器,返回包含源摘要和文章链接的网页。

第一部分使用了由smallguy78创建的RssReader类。它在自己的线程中运行,当前副本超过一小时后将下载源。第二部分由一个名为AggServer的TinyServer子类实现。AggServer只返回一个包含新闻源摘要和文章链接的页面。因此,doGet()非常简单:

protected override void doGet(string argument) { this.sendOk(); this.sendString(writeLinkPage()); }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485