介绍:
最开始我是由于兴趣去编写一个简单的webserver。但是在编写的过程中我意识到一个小的webserver在某些情况下会非常有用,比如说许多程序需要解析特定的简单的web页面,而不需要去支持asp.net。
一个最好例子是新闻聚合器,他只要解析包含当前新闻feed的页面。
代码:
这个程序的核心是TinyServer类。这个类提供了一个只支持Get请求(不支持表单)和单目录的web服务器。
你需要编译webserver项目和配置他的App.Config文件来运行WebServer
<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命令和返回任何字符。
以下是默认的实现:
{
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。
AggServer。AggServer仅仅返回一个包含新闻feeds的页面。因此doGet()方法是很简单的:
第二步 创建继承TinyServer的子类
{
this.sendOk();
this.sendString(writeLinkPage());
}
生成web页面写在writeLinkPage()
里面。他可以依靠RssReader.CreateHtml()实现。整个例子只用80行的代码。
smallguy78
你可以在这里了解示例中使用的RssReader
可以在原文下载所有的代码
原文:http://www.codeproject.com/csharp/meyntinyserver.asp