C#网络编程入门之HTTP
C#网络编程入门之HTTP
目录:
C#网络编程入门系列包括三篇文章:
(一)C#网络编程入门之UDP
(二)C#网络编程入门之TCP
(三)C#网络编程入门之HTTP
一、概述
本文目的是通过C#代码提供一个HTTP服务,正常情况下如果我们需要向外界提供HTTP服务,常规做法就是通过ASP.NET来实现,有时我们的应用程序或Windows服务需要向外提供一些简单的HTTP服务就可以自己实现,从而避免部署IIS增加系统复杂性。这里必须强调是一些简单的应用,如果应用比较复杂,涉及到路径解析HTML解析等,还是用WEB方式实现比较靠谱。
将HTTP和UDP、TCP放在同一个系列实际上有一点不合适,因为UDP、TCP属于传输层协议,HTTP属于应用层协议,希望读者首先有一个明确的了解。
二、 提供服务
首先启动HHTP服务:
if (!HttpListener.IsSupported)
{
Console.WriteLine("服务器操作系统不支持建立Http Server,需要更高版本的操作系统!");
return;
}
HttpListener httpListener = new HttpListener();
try
{
Console.WriteLine("正在启动Http服务");
int port = 9000;
httpListener.Prefixes.Add($"http://*:{port}/");
httpListener.Start();
Console.WriteLine("Http服务启动成功。");
}
catch (Exception ex)
{
Console.WriteLine($"启动Http服务出现异常:{ex.Message}");
return;
}
进行监听:
while (true)
{
Console.WriteLine("开始监听...");
HttpListenerContext context = httpListener.GetContext();
HttpListenerRequest request = context.Request;
string Method = request.HttpMethod.ToUpper();
Console.WriteLine($"收到请求,URL:{ request.Url} Method:{Method}");
Response(context, "hello");
}
代码循环进行监听,GetContext方法会引起阻塞,当收到浏览器请求时,服务器立即返回“Hello”。
Response方法实现如下:
private static void Response(HttpListenerContext context, string responseTxt)
{
HttpListenerResponse response = context.Response;
response.ContentType = "html";
response.ContentEncoding = Encoding.UTF8;
using (Stream output = response.OutputStream)
{
byte[] buffer2 = Encoding.UTF8.GetBytes(responseTxt);
output.Write(buffer2, 0, buffer2.Length);
}
}
此时打开浏览器输入地址 http://localhosthost:9000/ 看一下能否看到结果。(如果需要通过其他机器访问,本机要开放防火墙对应端口。)
注意:程序需要以管理员模型运行才能提供服务。
具体办法:工程新增应用程序清单文件:app.manifest,修改配置信息如下:
三、 响应
通过request.HttpMethod可以取得协议类型,对于GET和POST方法将采取不同的处理方式。
通过request.RawUrl可以取得URL路径,并进行解析,通过request.QueryString可以用户输入的参数值。
if (Method == "GET")
{
Console.WriteLine($"Get:RawURL:{ request.RawUrl}");
if (request.RawUrl.StartsWith("/version"))
{
Response(context, "Simple Http Server Ver:0.11");
continue;
}
else
{
string username = request.QueryString["username"];
string pwd = request.QueryString["pwd"];
Response(context, $"Welcome:{username}");
continue;
}
}
以上代码,如果输入:http://localhost:9000?username=hahaha
输出:Welcome:hahaha
在POST方法下,仍然可以通过request.QueryString取得用户通过URL输入的参数,但通过Body传输的数据需要通过其他方式进行读取。
if (Method == "POST")
{
Console.WriteLine($"POST:RawURL:{ request.RawUrl}");
string content = GetPostInput(request);
Console.WriteLine($"Content:{ content}");
Response(context, "\"{'Result':'Success','Message':'Hello'}\"");
continue;
}
GetPostInput方法实现如下:
private static string GetPostInput(HttpListenerRequest request)
{
Stream s = request.InputStream;
int count = 0;
byte[] buffer = new byte[1024];
StringBuilder builder = new StringBuilder();
while ((count = s.Read(buffer, 0, 1024)) > 0)
{
builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
}
s.Flush();
s.Close();
s.Dispose();
return builder.ToString();
}
为了方便起见,输入输出的数据最好采用json格式。
四、调试
可以通过Chrome或Postman来进行调试。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
C#网络编程入门之TCP
C#网络编程入门之TCP 目录:C#网络编程入门系列包括三篇文章: (一)C#网络编程入门之UDP (二)C#网络编程入门之TCP (三)C#网络编程入门之HTTP 一、概述UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.NET框架通过UdpClient、TcpListener 、TcpClient这几个类对Socket进行了封装,使其使用更加方便,本文就通过这几个封装过的类讲解一下相关应用。 二、基本应用:连接、发送、接收服务端建立侦听并等待连接: TcpListener tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 9000);tcpListener.Start();if (tcpListener.Pending()){ TcpClient client = tcpListener.AcceptTcpClient(); Console.WriteLine("Connected"); } 服务端是通过AcceptTcpClient方法获得TcpClient...
-
下一篇
React Suite 4.7.1 版本更新,React UI 库
React Suite 是一套 React 组件库,为后台产品而生,支持 Typescript,支持 RTL,支持服务端渲染。 文档:https://rsuitejs.com 设计:https://rsuitejs.com/design/default/ V4.7.1版本发布,更新内容如下: Improve: 改进<TreePicker>和<CheckTreePicker>在搜索时展开节点。 (#1075) Improve: 导出rsuite所有组件的props。 (#1068) Bugfix: 修复了<Slider>的最后一个标记的内容未点对齐的问题。(#1079) Bugfix: 修复了<Slider>拖拽手柄报错的问题。 (#1082) Bugfix: 修复了一些文档中的错误。 (#1080) Bugfix: 修复了一些 Typescript 类型定义错误。 (#1081) Chore: 添加commintlint,用于对 git meesage 的格式进行检查。 (#1078)
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL数据库在高并发下的优化方案
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8编译安装MySQL8.0.19
- Dcoker安装(在线仓库),最新的服务器搭配容器使用