现在的位置: 首页 > 综合 > 正文

[翻译]使用少于500行的代码创建一个webserver

2013年06月21日 ⁄ 综合 ⁄ 共 2319字 ⁄ 字号 评论关闭
平时我们都是用IIS服务器或Apache,这些都是相当成熟 功能强大的web服务器。是否好奇一个web服务器是如何编写出来的呢?下面这篇文章就是表述了如何用最少的代码创建一个简单的web服务器。

介绍:
最开始我是由于兴趣去编写一个简单的webserver。但是在编写的过程中我意识到一个小的webserver在某些情况下会非常有用,比如说许多程序需要解析特定的简单的web页面,而不需要去支持asp.net。
一个最好例子是新闻聚合器,他只要解析包含当前新闻feed的页面。

代码:
这个程序的核心是TinyServer类。这个类提供了一个只支持Get请求(不支持表单)和单目录的web服务器。
你需要编译webserver项目和配置他的App.Config文件来运行WebServer

<appSettings>
    
<add key="WebRoot" value="E:srcDotNetWebServer oot" />        
      
<!-- location of the web pages to serve -->
    
<add key="Default" value="default.html" />                        
      
<!-- name of the default page -->
    
<add key="TemplatePath" value="E:srcDotNetWebServerhtml" />   
      
<!-- location of special templates -->
    
<add key="Port" value="81" />                                     
      
<!-- Port to server on -->
    
<add key="LogFile" value="" />                                    
      
<!-- filepath, set to "" for console logging -->
    
<add key="LogLevel" value="All" />                                
      
<!--All, Warning, Error, None -->
</appSettings>

一旦webserver程序初始化Tinyserver和调用Run(),他会在一个新的线程中启动服务,调用Stop()来终止该进程。

建立你自己的WebServer
你也许很想建立满足自己需求的webserver,你只需要继承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");
}

要实现自己版本的webserver,下面还有一些需要重写的方法:
string getUrl(string argument) 获取doGet和Url的命令参数
string [] urlArgs  返回Url可以使用的参数列表
sendOK() 发送成功请求头
sendError(int errornr, string errorMsg) 发送错误
sendString(string) 发送信息
sendFile(path)  发送整个文件
sendTemplate (templateName) 发送在模板目录中的文件

RSS聚合器程序
为了演示这些功能,我写了一个简单的新闻聚合器。
RSS聚合器做了两件事:
1.下载和保持最新的RSS Feed
2.运行包含feed信息页面的web服务器

第一步 使用smallguy78写的RssReader类,他将运行在自己的线程,如果当前的feed已经过期了1个小时,他会自动的下载新的feed。
第二步 创建继承TinyServer的子类
AggServer。AggServer仅仅返回一个包含新闻feeds的页面。因此doGet()方法是很简单的:

protected override void doGet(string argument)
{
  
this.sendOk();
  
this.sendString(writeLinkPage());
}

生成web页面写在writeLinkPage()里面。他可以依靠RssReader.CreateHtml()实现。整个例子只用80行的代码。
你可以在这里了解示例中使用的RssReader
smallguy78

可以在原文下载所有的代码
原文:http://www.codeproject.com/csharp/meyntinyserver.asp

抱歉!评论已关闭.