教学小例子:简易的webSevrer
HttpListener 流利简单的API
static void Main()
{
using (var server = new SimpleWebServer("http://localhost:12345/", @"D:/webroot"))
{
Console.WriteLine("http服务开始监听......");
server.Start();
while (true)
{
var inStr = Console.ReadLine();
Debug.Assert(inStr != null, "inStr != null");
if (inStr.Equals("STOP", StringComparison.OrdinalIgnoreCase))
{
break;
}
Console.WriteLine("输入 stop 可停止服务!");
}
}
}
public class SimpleWebServer : IDisposable
{
private readonly HttpListener _httpListener;
private readonly string _baseFolder;
public SimpleWebServer(string uriPrefix, string baseFloder)
{
_httpListener = new HttpListener();
_httpListener.Prefixes.Add(uriPrefix);
_baseFolder = baseFloder;
}
public async void Start()
{
_httpListener.Start();
while (true)
{
try
{
var context = await _httpListener.GetContextAsync();
#pragma warning disable 4014
Task.Factory.StartNew(() =>{
PrcessRequestAsync(context);
});
}
catch (HttpListenerException exception)
{
Console.WriteLine(exception);
break;
}
catch (InvalidOperationException exception)
{
Console.WriteLine(exception);
break;
}
}
}
private async void PrcessRequestAsync(HttpListenerContext context)
{
try
{
string filename = Path.GetFileName(context.Request.RawUrl);
// ReSharper disable once AssignNullToNotNullAttribute
string path = Path.Combine(_baseFolder, filename);
byte[] msg = new byte[0];
if (File.Exists(path))
{
if (context.Request.HttpMethod == "GET")
{
context.Response.StatusCode = (int) HttpStatusCode.OK;
msg = File.ReadAllBytes(path);
}
else if (context.Request.HttpMethod=="POST")
{
context.Response.StatusCode = (int)HttpStatusCode.Created;
}
else
{
context.Response.StatusCode = (int) HttpStatusCode.HttpVersionNotSupported;
}
}
else
{
Console.WriteLine($"资源不存在:{path}");
context.Response.StatusCode = (int) HttpStatusCode.NotFound;
msg = Encoding.Default.GetBytes(" ...你网址打错了... ");
}
context.Response.ContentLength64 = msg.Length;
using (Stream s = context.Response.OutputStream)
{
await s.WriteAsync(msg, 0, msg.Length);
}
}
catch (Exception exception)
{
Console.WriteLine($"请求发生了错误:{exception}");
}
}
public void Dispose()
{
_httpListener.Stop();
}
}
效果:





教学小例子:简易的webSevrer的更多相关文章
- javascript平时小例子⑥(简易计算器的制作)
<!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...
- HTML5 Canvas 小例子 简易画板
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- WebService小例子———
WebService学习(刚开始) ———————————————————————————————————————————————————————————————————— WebService:跨平 ...
- springmvc入门的第一个小例子
今天我们探讨一下springmvc,由于是初学,所以简单的了解一下 springmvc的流程,后续会持续更新... 由一个小例子来简单的了解一下 springmvc springmvc是spring框 ...
- java即时通信小例子
学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是 ...
- Runtime的几个小例子(含Demo)
一.什么是runtime(也就是所谓的“运行时”,因为是在运行时实现的.) 1.runtime是一套底层的c语言API(包括很多强大实用的c语言类型,c语言函数); [runti ...
- bootstrap 模态 modal 小例子
bootstrap 模态 modal 小例子 <html> <head> <meta charset="utf-8" /> <title ...
- INI配置文件分析小例子
随手写个解析INI配置字符串的小例子 带测试 #include <iostream> #include <map> #include <string> #inclu ...
- JavaScript小例子:复选框全选
JavaScript小例子:复选框全选 这只是一个小例子,很简单,但是这个功能还是很常用的: 实现后效果如图: JavaScript代码: <script type="text/jav ...
随机推荐
- Kafka官方文档翻译——简介
简介 Kafka擅长于做什么? 它被用于两大类应用: 在应用间构建实时的数据流通道 构建传输或处理数据流的实时流式应用 几个概念: Kafka以集群模式运行在1或多台服务器上 Kafka以topics ...
- 安装旧版的docker-engine-1.12.6
执行kubeadm init --api-advertise-addresses=172.16.160.211命令的时候,提示docker版本太新了 想要安装旧版docker,可以使用以下方法: yu ...
- 从String类型字符串的比较到StringBuffer和StringBuilder
1. String类型 String类源码 为了从本质上理解String类型的特性所在,我们从String类型的源码看起,在源码中String类的注释中存在以下: /**Strings are con ...
- 数独小算法,测试通过(Java)
class SudokuMatrix { private int[][] matrix = new int[][] { {0, 5, 0, 6, 0, 1, 0, 0, 0}, {0, 0, 7, 0 ...
- img如果没有图片显示默认图片效果
img如果没有图片显示默认图片效果<img src="本来要显示的图片URL" onerror="this.src='图片挂了的话要显示的默认图片URL'" ...
- 将百度坐标转换的javascript api官方示例改写成传统的回调函数形式
改写前: 百度地图中坐标转换的JavaScript API示例官方示例如下: var points = [new BMap.Point(116.3786889372559,39.90762965106 ...
- 很好的复习资料: SQL语句到底怎么写 ?
本文用到的数据库如下: CREATE DATABASE exam; /*创建部门表*/ CREATE TABLE dept( deptno INT PRIMARY KEY, dname VARCHAR ...
- Redis 内存管理与事件处理
1 Redis内存管理 Redis内存管理相关文件为zmalloc.c/zmalloc.h,其只是对C中内存管理函数做了简单的封装,屏蔽了底层平台的差异,并增加了内存使用情况统计的功能. void * ...
- 如何连接新浪sae共享数据库
网上找了很久,太杂了,下文介绍如何连接新浪sae共享数据库,方便有效 1.首先贴出官方文档: 以下是一些和共享MySQL数据库服务相关的预定义常量,你可以直接引用这些参数来连接数据库: 用户名 : S ...
- rails 多态
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #f4f4f4; background-color: rgba( ...