c# HttpServer 的使用
在很多的时候,我们写的应用程序需要提供一个信息说明或者告示功能,希望借助于HttpServer来发布一个简单的网站功能,但是又不想架一个臃肿的Http服务器功能,
这时候,标准框架提供的HttpServer功能或许是我们的选择。
一引入using System.Net;
二开始服务
1 public class ServerHelper
2 {
3 HttpListener httpListener = new HttpListener();
4 public void Setup(int port=8080)
5 {
6 httpListener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
7 httpListener.Prefixes.Add(string.Format("http://*:{0}/",port));//如果发送到8080 端口没有被处理,则这里全部受理,+是全部接收
8 httpListener.Start();//开启服务
9
10 Receive();//异步接收请求
11 }
12
13 private void Receive()
14 {
15 httpListener.BeginGetContext(new AsyncCallback(EndReceive), null);
16 }
17
18 void EndReceive(IAsyncResult ar)
19 {
20 var context = httpListener.EndGetContext(ar);
21 Dispather(context);//解析请求
22 Receive();
23 }
24
25 RequestHelper RequestHelper;
26 ResponseHelper ResponseHelper;
27 void Dispather(HttpListenerContext context)
28 {
29 HttpListenerRequest request= context.Request;
30 HttpListenerResponse response = context.Response;
31 RequestHelper = new RequestHelper(request);
32 ResponseHelper = new ResponseHelper(response);
33 RequestHelper.DispatchResources(fs => {
34 ResponseHelper.WriteToClient(fs);// 对相应的请求做出回应
35 });
36 }
37 }
三解析请求
1 public class RequestHelper
2 {
3 private HttpListenerRequest request;
4 public RequestHelper(HttpListenerRequest request)
5 {
6 this.request = request;
7 }
8 public Stream RequestStream { get; set; }
9 public void ExtracHeader()
10 {
11 RequestStream= request.InputStream;
12 }
13
14 public delegate void ExecutingDispatch(FileStream fs);
15 public void DispatchResources(ExecutingDispatch action)
16 {
17 var rawUrl = request.RawUrl;//资源默认放在执行程序的wwwroot文件下,默认文档为index.html
18 string filePath = string.Format(@"{0}/wwwroot{1}", Environment.CurrentDirectory, rawUrl);//这里对应请求其他类型资源,如图片,文本等
19 if (rawUrl.Length==1)
20 filePath = string.Format(@"{0}/wwwroot/index.html", Environment.CurrentDirectory);//默认访问文件
21 try {
22 if (File.Exists(filePath))
23 {
24 FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite);
25
26 action?.Invoke(fs);
27
28 }
29 }
30 catch { return; }
31 }
32 public void ResponseQuerys()
33 {
34 var querys = request.QueryString;
35 foreach (string key in querys.AllKeys)
36 {
37 VarityQuerys(key,querys[key]);
38 }
39 }
40
41 private void VarityQuerys(string key,string value)
42 {
43 switch(key)
44 {
45 case "pic":Pictures(value); break;
46 case "text":Texts(value); break;
47 default:Defaults(value); break;
48 }
49 }
50
51 private void Pictures(string id)
52 {
53
54 }
55
56 private void Texts(string id)
57 {
58
59 }
60
61 private void Defaults(string id)
62 {
63
64 }
65
66 }
四回应请求
public class ResponseHelper
{
private HttpListenerResponse response;
public ResponseHelper(HttpListenerResponse response)
{
this.response = response;
OutputStream = response.OutputStream; }
public Stream OutputStream { get; set; }
public class FileObject
{
public FileStream fs;
public byte[] buffer;
}
public void WriteToClient(FileStream fs)
{
response.StatusCode = 200;
byte[] buffer = new byte[1024];
FileObject obj = new FileObject() { fs = fs, buffer = buffer };
fs.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(EndWrite), obj);
}
void EndWrite(IAsyncResult ar)
{
var obj = ar.AsyncState as FileObject;
var num= obj.fs.EndRead(ar);
OutputStream.Write(obj.buffer,0,num);
if (num < 1) {
obj.fs.Close(); //关闭文件流
OutputStream.Close();//关闭输出流,如果不关闭,浏览器将一直在等待状态
return;
}
obj.fs.BeginRead(obj.buffer, 0, obj.buffer.Length, new AsyncCallback(EndWrite), obj);
}
}
测试结果:
准备的index.html,里面包含了图片和普通html

资源目录:

浏览器进行访问测试:

总结:
本文只是对httpserver进行简单的测试,简单的进行请求和回应的梳理,对于想要复杂的浏览器功能,需要详细的研究下其他浏览器的工作原理
c# HttpServer 的使用的更多相关文章
- NodeJS 最快速搭建一个HttpServer
最快速搭建一个HttpServer 在目录里放一个index.html cd D:\Web\InternalWeb start http-server -i -p 8081
- 基于Netty4的HttpServer和HttpClient的简单实现
Netty的主页:http://netty.io/index.html 使用的Netty的版本:netty-4.0.23.Final.tar.bz2 ‐ 15-Aug-2014 (Stable, Re ...
- libevent源码分析:http-server例子
http-server例子是libevent提供的一个简单web服务器,实现了对静态网页的处理功能. /* * gcc -g -o http-server http-server.c -levent ...
- httpserver
改了下 # -*- coding:utf-8 -*- from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler HOST = &quo ...
- 一个简单的零配置命令行HTTP服务器 - http-server (nodeJs)
http-server 是一个简单的零配置命令行HTTP服务器, 基于 nodeJs. 如果你不想重复的写 nodeJs 的 web-server.js, 则可以使用这个. 安装 (全局安装加 -g) ...
- nodejs搭建http-server
很多时候我们都需要搭建一个简单的服务器,部署在IIS,阿帕奇,或者用nodejs,网上很多关于nodejs搭建server的文章,但都是要创建server.js,很麻烦, 在这里我分享一个创建ht ...
- 一、HTTPServer,RequestHandler,ServerHandler,Handler
1. HTTPServer,RequestHandler,ServerHandler,Handler 1.1 基本概念 HTTPServer主要是对传输控制层HTTP,TCP,S ...
- nodejs:本地文件夹http服务器http-server
一.已经安装nodejs的电脑,有一个方便通过http访问本地文件夹.文件夹服务器 static files over HTTP,并不是我们平常说的node那个web服务器哦 二.好处 可以方便实现跨 ...
- PHP使用libevent实现高性能httpServer
今天发现php也有一个libevent的扩展,安装后尝试下了一个webserver(httpserver), 发现性能还不错,逻辑很简单,每秒响应速度1800~4000次/s 代码如下 <?ph ...
- netty httpserver
netty也可以作为一个小巧的http服务器使用. package com.ming.netty.http.httpserver; import java.net.InetSocketAddress; ...
随机推荐
- CocosCreator 性能优化:DrawCall
在游戏开发中,DrawCall 作为一个非常重要的性能指标,直接影响游戏的整体性能表现. 无论是 Cocos Creator.Unity.Unreal 还是其他游戏引擎,只要说到游戏性能优化,Draw ...
- 「postOI」Colouring Game
题意 有 \(n\) 个格子排成一行,一开始每个格子上涂了蓝色或红色. Alice 和 Bob 用这些格子做游戏.Alice 先手,两人轮流操作: Alice 操作时,选择两个相邻的格子,其中至少要有 ...
- QDir类和方法应用
QDir类提供了访问系统目录结构及其内容的与平台无关的方式. 头文件:#include <qdir.h> QDir类用来操作路径名及底层文件系统,获取关于目录路径及文件的相关信息,也可以用 ...
- UITextView布局不是从0开始的问题
///去掉padding UITextView.textContainer.lineFragmentPadding = 0; UITextView.textContainerInset = UIEdg ...
- 【记录】 iSCSI服务器的搭建与使用[Debian]
序言 更换系统后需要一个网络文件存储用于备份文件,本想用NFS多方便,但是timeshift不支持网络存储,备份路径必须是一个块存储设备, 但是你还必须分好文件系统,这不是多此一举???反正我只用rs ...
- Scala集合排序
Scala集合排序有三种方法:sorted.sortBy().sortWith() (1)sorted 对一个集合进行自然排序,通过传递隐式的Ordering源码中有两点值得注意的地方:1.sorte ...
- SQLSERVER自动备份数据库
1. 通过操作系统的定时任务执行 创建两个文件,auto.bat和auto.sql,使用bat调用sql文件中的代码段 auto.bat内容 sqlcmd -S localhost,2433 -U s ...
- system verilog与C语言的接口(包含使用方法以及实例)
资料来源 (1) sv绿皮书; (2) vcs user guide; (3) https://www.cnblogs.com/studyforever/p/5169243.html (4) syst ...
- centos7.2下配置DNS服务器
https://baijiahao.baidu.com/s?id=1748980460185046641&wfr=spider&for=pc 1.安装bind(服务器) yum -y ...
- 【Ubuntu】Ubuntu 技巧集锦
『Ubuntu 22.04 国内镜像 阿里云/163源/清华大学/中科大』 『各种 Proxy 设置 GUI/Terminal/APT』 『设置 wget Proxy』 『设置右键菜单-新建文档』 『 ...