自己实现简单Web服务器,支持GET POST请求
最近项目上遇到一个需求,最后想到的解决方案是自己实现一个web服务器去处理请求,然后再将信息发送到另外一个程序。然后返回处理之后的结果呈现出来。
现在我就来分享一下如何实现的。
通过.NET 为我们提供的HttpListener类实现对Http协议的处理,实现简单的web服务器。
注意:此类在 .NET Framework 2.0 版中是新增的。所以支持.NET Framework 2.0以上版本。该类仅在运行 Windows XP SP2 或 Windows Server 2003 操作系统的计算机上可用。
引用命名空间:using System.Net;
使用Http服务一般步骤如下:
-
创建一个HTTP侦听器对象并初始化
-
开始侦听来自客户端的请求
-
处理客户端的Http请求
-
关闭HTTP侦听器
创建一个HTTP侦听器对象
创建HTTP侦听器对象只需要新建一个HttpListener对象即可。
HttpListener listener = new HttpListener();
初始化需要经过如下两步
- 添加需要监听的URL范围至listener.Prefixes中,可以通过如下函数实现:
listener.Prefixes.Add("http://127.0.0.1:8080/") //必须以'/'结尾
- 调用listener.Start()实现端口的绑定,并开始监听客户端的需求。
侦听来自客户端的请求
这里有2种方式可以侦听HTTP请求,获取HttpListenerContext的最简单方式如下:
HttpListenerContext context = listener.GetContext();
该方法将阻塞调用函数至接收到一个客户端请求为止,如果要提高响应速度,可使用异步方法listener.BeginGetContext()来实现HttpListenerContext对象的获取。
我使用的是异步方式实现对HttpListenerContext对象的获取。
处理客户端的HTTP请求
获取HttpListenerContext后,可通过Request属性获取表示客户端请求的对象,通过Response属性取表示 HttpListener 将要发送到客户端的响应的对象。
HttpListenerRequest request = context.Request; HttpListenerResponse response = context.Response;
关闭HTTP侦听器
通过调用listener.Stop()函数即可关闭侦听器,并释放相关资源
实现GET POST请求处理
GET请求比较简单,直接通过 request.QueryString["linezero"]; QueryString就可以实现获取参数。
POST请求由于HttpListener 不提供实现,需要自己做处理。在下面相关代码中会贴出方法。
相关代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; namespace WebConsole { class Program { static HttpListener sSocket; static void Main(string[] args) { sSocket = new HttpListener(); sSocket.Prefixes.Add("http://127.0.0.1:8080/"); sSocket.Start(); sSocket.BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket); Console.WriteLine("已启动监听,访问http://127.0.0.1:8080/"); Console.ReadKey(); } static void GetContextCallBack(IAsyncResult ar) { try { sSocket = ar.AsyncState as HttpListener; HttpListenerContext context = sSocket.EndGetContext(ar); //再次监听请求 sSocket.BeginGetContext(new AsyncCallback(GetContextCallBack), sSocket); //处理请求 string a = Request(context.Request); //输出请求 Response(context.Response, a); } catch { } } /// <summary> /// 处理输入参数 /// </summary> /// <param name="request"></param> /// <returns></returns> static string Request(HttpListenerRequest request) { string temp = "welcome to linezero!"; if (request.HttpMethod.ToLower().Equals("get")) { //GET请求处理 if (!string.IsNullOrEmpty(request.QueryString["linezero"])) temp = request.QueryString["linezero"]; } else if (request.HttpMethod.ToLower().Equals("post")) { //这是在POST请求时必须传参的判断默认注释掉 //if (!request.HasEntityBody) //{ // temp = "请传入参数"; // return temp; //} //POST请求处理 Stream SourceStream = request.InputStream; byte[] currentChunk = ReadLineAsBytes(SourceStream); //获取数据中有空白符需要去掉,输出的就是post请求的参数字符串 如:username=linezero temp = Encoding.Default.GetString(currentChunk).Replace("", ""); } return temp; } static byte[] ReadLineAsBytes(Stream SourceStream) { var resultStream = new MemoryStream(); while (true) { int data = SourceStream.ReadByte(); resultStream.WriteByte((byte)data); if (data <= 10) break; } resultStream.Position = 0; byte[] dataBytes = new byte[resultStream.Length]; resultStream.Read(dataBytes, 0, dataBytes.Length); return dataBytes; } /// <summary> /// 输出方法 /// </summary> /// <param name="response">response对象</param> /// <param name="responseString">输出值</param> /// <param name="contenttype">输出类型默认为json</param> static void Response(HttpListenerResponse response, string responsestring, string contenttype = "application/json") { response.StatusCode = 200; response.ContentType = contenttype; response.ContentEncoding = Encoding.UTF8; byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responsestring); //对客户端输出相应信息. response.ContentLength64 = buffer.Length; System.IO.Stream output = response.OutputStream; output.Write(buffer, 0, buffer.Length); //关闭输出流,释放相应资源 output.Close(); } } }
最后启动程序,在地址栏里输入http://127.0.0.1:8080 就可以访问了。
如果你觉得本文对你有帮助,请点击“推荐”,谢谢。
相关文章
- 用dotnet core搭建web服务器(二)路由表与封装
- 用dotnet core 搭建web服务器(一)http server
- 群晖NAS搭建web服务器并公网可访问 4-4
- 树莓派搭建Web网站,并内网穿透发布上线无需服务器 2-4
- 小白如何搭建Python自带静态Web服务器?
- 小白如何搭建Python自带静态Web服务器?
- 用iLO在惠普服务器安装exsi6.5
- Vue - 实现图片裁剪功能,并上传到服务器(内置第三方最优秀的裁剪图片组件,上传到服务器功能)干净整洁无 BUG 的示例源码与超详细的注释,兼容任意浏览器
- 树莓派使用实例之:2 Pi R 第二篇:Web服务器
- 如何在Ubuntu 14.04上安装轻量级web服务器Cherokee
- 阿里云部署自己的web服务器
- 【转】常用服务器模型总结
- 将Web项目War包部署到Tomcat服务器
- 移植 thttpd Web 服务器
- Linux下安装Tomcat服务器和部署Web应用
- Ubuntu Server无桌面无显示器情况下虚拟屏幕xvfb的安装及设置—ubuntu18.04server服务器系统下为python安装虚拟显示器 (使用jupyter notebook在web端播放openai的gym下保存的运行视频——需安装ipython)
- 使用LoadRunner对web服务器压力测试总结
- Centos下安装git的web服务器
- 【开发工具】TortoiseSVN连接不上服务器解决方案
- Maven(三):将web项目的war包热部署到远程Tomcat服务器
- asp.net web api的自托管模式HttpSelfHostServer可以以控制台程序或windows服务程序为宿主,不单单依赖于IIS web服务器
- ARM抢攻服务器市场 布局物联网/车联网等市场
- Django+Vue项目学习第九篇:vue项目部署到服务器
- 授权给adfs读取ad 在ad服务器上运行 - setspn 命令 -摘自网络
- 云服务器 ECS 建站教程:手工部署Java Web项目
- Windows上最全wsl2使用配置,包含基础配置、高级配置、开发工具、机器学习环境配置、机器人与自动驾驶环境配置(如Ros及百度的无人驾驶系统apollo)、服务器及Web开发环境配置等等