1 Star 2 Fork 1

fawdlstty / hanHttpLib

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
hanHttpServer.cs 5.04 KB
一键复制 编辑 原始数据 按行查看 历史
fawdlstty 提交于 2017-11-06 17:02 . 手误
////////////////////////////////////////////////////////////////////////////////
//
// Class Name: hanHttpServer
// Description: C# HTTP服务器类
// Class URI: https://github.com/fawdlstty/hanHttpLib
// Author: Fawdlstty
// Author URI: https://www.fawdlstty.com/
// Version: 0.1
// License: MIT
// Last Update: Oct 27, 2017
//
////////////////////////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Text;
using System.Threading;
using System.Web;
namespace hanHttpLib
{
public class hanHttpServer
{
HttpListener m_listener = null;
/// <summary>
/// 启动服务
/// </summary>
public void start (ushort uPort)
{
if (m_listener != null)
return;
m_listener = new HttpListener ();
m_listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
// 下面这一行需要管理员权限。如果只需本地运行,那么不需管理员权限,加入 "http://localhost:8080/" 即可
m_listener.Prefixes.Add (string.Format ("http://+:{0}/", uPort));
m_listener.Start ();
m_listener.BeginGetContext (_on_client_request, m_listener);
}
/// <summary>
/// 停止服务
/// </summary>
public void stop ()
{
if (m_listener == null)
return;
m_listener.Stop ();
m_listener.Close ();
m_listener = null;
}
private delegate void del_write_stream (Stream stm, String data);
private delegate string del_get_value (string key);
/// <summary>
/// 当客户端请求时的异步回调函数
/// </summary>
/// <param name="result"></param>
private void _on_client_request (IAsyncResult result)
{
HttpListener _listener = (HttpListener) result.AsyncState;
if (_listener == null || m_listener == null || !_listener.IsListening)
return;
HttpListenerContext ctx = _listener.EndGetContext (result);
ThreadPool.QueueUserWorkItem (_ctx =>
{
_process_request ((HttpListenerContext) _ctx);
}, ctx);
_listener.BeginGetContext (_on_client_request, _listener);
}
private void _process_request (HttpListenerContext ctx)
{
try
{
HttpListenerRequest req = ctx.Request;
HttpListenerResponse res = ctx.Response;
string str_url = req.RawUrl.Substring (1);
// 读取Post参数
List<string> post_keys = new List<string> (), post_values = new List<string> ();
using (StreamReader sr = new StreamReader (req.InputStream))
{
string[] pairs = sr.ReadToEnd ().Split (new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string pair in pairs)
{
string[] item = pair.Split (new char[] { '=' });
if (item.Length > 1)
{
post_keys.Add (HttpUtility.UrlDecode (item[0]));
post_values.Add (HttpUtility.UrlDecode (item[1]));
}
}
}
// 获取请求参数
del_get_value get_value = (key) =>
{
string value = req.QueryString[key];
if (string.IsNullOrEmpty (value))
{
int p = post_keys.IndexOf (key);
if (p >= 0)
value = post_values[p];
}
if (string.IsNullOrEmpty (value))
return "";
return value;
};
// 此处根据str_url处理输出,假定输入内容写在str里
// 获取请求参数 get_value ("test")
string str = "ok";
res.StatusCode = 200;
// HTTP头输入可以自定
res.AppendHeader ("Cache-Control", "private");
res.AppendHeader ("Content-Type", "text/html; charset=utf-8");
//res.AppendHeader ("Server", "Microsoft-IIS/7.5"); //nginx/1.9.12
res.AppendHeader ("X-Powered-By", "ASP.NET");
res.AppendHeader ("X-AspNet-Version", "4.0.30319");
//res.AppendHeader ("Content-Length", "");
// 是否启用压缩
string[] encoding = req.Headers["Accept-Encoding"].Split (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < encoding.Length; ++i)
encoding[i] = encoding[i].Trim ();
del_write_stream write_stream = (stream, data) =>
{
using (StreamWriter sw = new StreamWriter (stream, Encoding.UTF8))
sw.Write (data);
};
if (Array.IndexOf (encoding, "gzip") >= 0)
{
// 使用 gzip 压缩
res.AppendHeader ("Content-Encoding", "gzip");
res.AppendHeader ("Vary", "Accept-Encoding");
using (GZipStream gzip = new GZipStream (res.OutputStream, CompressionMode.Compress))
write_stream (gzip, str);
}
else if (Array.IndexOf (encoding, "deflate") >= 0)
{
// 使用 deflate 压缩
res.AppendHeader ("Content-Encoding", "deflate");
res.AppendHeader ("Vary", "Accept-Encoding");
using (DeflateStream deflate = new DeflateStream (res.OutputStream, CompressionMode.Compress))
write_stream (deflate, str);
}
else
{
// 不使用压缩
write_stream (res.OutputStream, str);
}
res.OutputStream.Close ();
}
catch (Exception)
{
// something is wrong...
}
}
}
}
C#
1
https://gitee.com/fawdlstty/hanHttpLib.git
git@gitee.com:fawdlstty/hanHttpLib.git
fawdlstty
hanHttpLib
hanHttpLib
master

搜索帮助