设为首页 收藏本站
查看: 844|回复: 0

[经验分享] 编写一个简单的Web Server

[复制链接]

尚未签到

发表于 2017-12-7 15:47:53 | 显示全部楼层 |阅读模式
  编写一个简单的Web Server其实是轻而易举的。如果我们只是想托管一些HTML页面,我们可以这么实现:
  在VS2013中创建一个C# 控制台程序
  编写一个字符串扩展方法类,主要用于在URL中截取文件名
  ExtensionMethods.cs



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace webserver1
{   
/// <summary>
/// 一些有用的字符串扩展方法
/// </summary>
public static class ExtensionMethods
{   
/// <summary>
/// 返回给定字符串左侧的字串或是整个源字符串
/// </summary>
/// <param name="src">源字符串</param>
/// <param name="s">对比字符串</param>
/// <returns></returns>
public static string LeftOf(this String src, string s)
{
string ret = src;
int idx = src.IndexOf(s);
if (idx != -1) { ret = src.Substring(0, idx); }
return ret;
}
/// <summary>
/// 返回给定字符串右侧的字串或是整个源字符串
/// </summary>
/// <param name="src">源字符串</param>
/// <param name="s">对比字符串</param>
/// <returns></returns>
public static string RightOf(this String src, string s)
{   
string ret = String.Empty;
int idx = src.IndexOf(s);
if (idx != -1) {
ret = src.Substring(idx + s.Length);
} return ret;
}
}
}
  在入口程序中开启HTTP监听
  Program.cs



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Net;
using System.IO;
namespace webserver1
{
class Program
{
static Semaphore sem;
static void Main(string[] args)
{   
//支持模拟20个连接
sem = new Semaphore(20, 20);
HttpListener listener = new HttpListener();
string url = "http://localhost/";
listener.Prefixes.Add(url);
listener.Start();
Task.Run(() =>
{   
while (true) {
sem.WaitOne();
StartConnectionListener(listener);
}
});
Console.WriteLine("点击任意键,退出WebServer");
Console.ReadLine();
}
static async void StartConnectionListener(HttpListener listener)
{
// 等待连接。
HttpListenerContext context = await listener.GetContextAsync();
//释放信号器,另外一个监听器可以立刻开启
            sem.Release();
//获得请求对象
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
// 在URL路径上截取文件名称, 介于 "/" 和 "?"之间
string path = request.RawUrl.LeftOf("?").RightOf("/");
Console.WriteLine(path);
//输出一些内容
try
{   
// 加载文件并以UTF-8的编码返回
string text = File.ReadAllText(path);
byte[] data = Encoding.UTF8.GetBytes(text);
response.ContentType = "text/html";
response.ContentLength64 = data.Length;
response.OutputStream.Write(data, 0, data.Length);
response.ContentEncoding = Encoding.UTF8;
response.StatusCode = 200;
response.OutputStream.Close();
}
catch (Exception ex) { Console.WriteLine(ex.Message); }
}
}
}
  上面的代码初始化了20个监听器。 采用信号器(Semaphore),当一个请求收到后,释放一个信号器,一个新的监听器再次被创建。这个服务器可以同时接收20个请求。使用await机制来处理线程是否继续运行。如果你不熟悉Task、async/await的使用,建议参考一些文档。
  创建一个HTML文件,并把属性{复制到输入目录}设置为 “如果较新则复制”
   index.html



<html>
<head>
<title>Simple WebServer</title>
</head>
<body>
<p>Hello World</p>
</body>
</html>

  整个目录结构
DSC0000.png

  运行控制台程序,在浏览器中输入地址:



http://localhost/index.html

DSC0001.png

  如果浏览器无法访问localhost,编辑C:\Windows\System32\drivers\etc\hosts文件,保证有一条这样的记录



127.0.0.1 localhost
  代码下载

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421799-1-1.html 上篇帖子: SQL Server Alwayson概念总结 下篇帖子: 阿里云部署nodejs服务器(windows)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表