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;}
进行监听:1
2
3
4
5
6
7
8
9
10
11
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,修改配置信息如下:
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"><security><requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /></requestedPrivileges></security></trustInfo>
三、 响应
通过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传输c#教程的数据需要通过其他方式进行读取。
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来进行调试。
传送门:
C#网络编程入门系列包括三篇文章:
(一)C#网络编程入门之UDP
(二)C#网络编程入门之TCP
(三)C#网络编程入门之HTTP
以上就是c# 提供一个HTTP服务的实现示例的详细内容
c# 网络编程之http相关推荐
- java 网络编程简单聊天_网络编程之 TCP 实现简单聊天
网络编程之 TCP 实现简单聊天 客户端 1.连接服务器 Socket 2.发送消息 package lesson02;import java.io.IOException;import java.i ...
- Java网络编程之TCP、UDP
Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. J ...
- java网络编程之TCP通讯
java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, 1 /* 2 *TCP 3 *建立连接,形成传输数据的通道: 4 *在连接中进行大数据量传输: ...
- Linux网络编程之IP地址转换为无符号整数的方法
Linux网络编程之IP地址转换为无符号整数的方法,代码如下:(没考虑异常输入) #include <stdio.h> #include <string.h> #include ...
- 浅谈Java网络编程之Socket (2)
<浅谈Java网络编程之Socket (1)>中我们已经和大家说到客户端的网络编程,下面和大家分享的是服务器的实现代码. import java.net.*; import java.io ...
- iOS网络编程之Socket
[深入浅出Cocoa]iOS网络编程之Socket 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 更多 Cocoa 开发文章,敬请访问<深入浅 ...
- Python中的网络编程之TCP
Python中的网络编程之TCP 文章目录 Python中的网络编程之TCP 1.TCP介绍 2.TCP特点 3.TCP与UDP的不同点 4.tcp通信模型 5.tcp客户端 6.tcp服务器 7.T ...
- Python中的网络编程之UDP
Python中的网络编程之UDP 文章目录 Python中的网络编程之UDP 一.Socket编程 `1.什么是客户端/服务器架构`? **`2.套接字:通信端点`** 3.套接字地址:主机-端口对 ...
- [深入浅出Cocoa]iOS网络编程之NSStream
2019独角兽企业重金招聘Python工程师标准>>> [深入浅出Cocoa]iOS网络编程之NSStream 目录(?)[+] [深入浅出Cocoa]iOS网络编程之NSStrea ...
- 浅谈Java网络编程之Socket (1)
和大家一起分享的是Java网络编程之Socket.在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是get ...
最新文章
- 移动开发—HTML5 or Native?
- jQuery特性效果与链式调用
- Android实现打开本地文件,Android 打开本地文件(示例代码)
- 应付账款账龄分析模板_企业财务报表分析论文应如何着手?
- stl vector 函数_vector :: front()函数以及C ++ STL中的示例
- Java中高级核心知识全面解析——常用框架(SpringMVC-工作原理详解)
- 汉字转拼音的代码-转
- php libpng 不兼容,Python matplotlib和libpng不兼容issu
- 查找Excel最后一个非空单元格的值,你会吗?(适用于数据加行时,一直引用最后一个非空单元格的值)
- zzuli oj 1077
- 戴尔u盘安装linux系统,戴尔服务器操作系统安装 Centos 系统安装详解教程。
- 深度学习是当前很热门的机器学习算法。在深度学习中,涉及到大量矩阵相乘,
- php怎么弄三角形,css中怎么设置三角形
- Zbrush一些基本操作
- 快手扫码登录【2021-12-03】
- 如何高效编写Go单元测试(一)
- 前端搭建私有化npm库
- C语言学习那些容易被我们忽视的知识
- 拆解APP北极星指标——DAU
- Landslide detection from an open satellite imagery 使用注意力增强卷积神经网络从开放的卫星图像和数字高程模型数据集检测滑坡
热门文章
- python使用urllib2_Python中urllib2总结
- Android系统版本和API 版本的对应关系
- sqlserver数据库批量插入-SqlBulkCopy
- java 指定utf8mb4_spring boot 使用utf8mb4的操作
- linux 下gz文件解压命令,Linux解压gz文件的命令怎么写
- c语言枚举进程以及遇到的编码问题
- 每日新闻:阿里机器智能实验室主任金榕:AI不只是统计学;中外科研人员合作开发出光量子计算芯片...
- 怎样搞懂Linux内核内存管理中的KASAN实现原理
- CSRF攻击与防御(写得非常好)
- ModelMap的作用