C# 控制台或者winform程序开启http的监听状态
1 public class THttpListener 2 { 3 HttpListener listerner; 4 /// <summary> 5 /// 6 /// </summary> 7 /// <param name="prefixes">格式 http://*/test/ </param> 8 /// <param name="authent"></param> 9 public THttpListener(string[] prefixes, AuthenticationSchemes authent = AuthenticationSchemes.Anonymous) 10 { 11 listerner = new HttpListener(); 12 listerner.AuthenticationSchemes = authent;//指定身份验证 Anonymous匿名访问 13 foreach (var item in prefixes) 14 { 15 listerner.Prefixes.Add(item); 16 Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + " : HttpListener:" + item); 17 } 18 } 19 20 public delegate void ResponseEventArges(HttpListenerContext ctx); 21 public event ResponseEventArges ResponseEvent; 22 AsyncCallback ac = null; 23 24 public void Start() 25 { 26 if (!listerner.IsListening) 27 { 28 listerner.Start(); 29 ac = new AsyncCallback(GetContextAsyncCallback); 30 listerner.BeginGetContext(ac, null); 31 Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + " : Start"); 32 } 33 } 34 35 /// <summary> 36 /// 停止监听服务 37 /// </summary> 38 public void Stop() 39 { 40 listerner.Stop(); 41 } 42 43 /// <summary> 44 /// 收到监听请求回调 45 /// </summary> 46 /// <param name="ia"></param> 47 public void GetContextAsyncCallback(IAsyncResult ia) 48 { 49 if (ia.IsCompleted) 50 { 51 var ctx = listerner.EndGetContext(ia); 52 ctx.Response.StatusCode = 200; 53 if (ResponseEvent != null) 54 { 55 ResponseEvent.BeginInvoke(ctx, null, null); 56 } 57 else 58 { 59 System.IO.BinaryWriter br = new System.IO.BinaryWriter(ctx.Response.OutputStream, new UTF8Encoding()); 60 br.Write("error: 服务器未处理"); 61 ctx.Response.Close(); 62 br.Close(); 63 br.Dispose(); 64 } 65 } 66 listerner.BeginGetContext(ac, null); 67 } 68 69 public Dictionary<string, string> getData(System.Net.HttpListenerContext ctx) 70 { 71 var request = ctx.Request; 72 if (request.HttpMethod == "GET") 73 { 74 return getData(ctx, DataType.Get); 75 } 76 else 77 { 78 return getData(ctx, DataType.Post); 79 } 80 } 81 82 public Dictionary<string, string> getData(System.Net.HttpListenerContext ctx, DataType type) 83 { 84 var rets = new Dictionary<string, string>(); 85 var request = ctx.Request; 86 switch (type) 87 { 88 case DataType.Post: 89 if (request.HttpMethod == "POST") 90 { 91 string rawData; 92 using (var reader = new StreamReader(request.InputStream, request.ContentEncoding)) 93 { 94 rawData = reader.ReadToEnd(); 95 } 96 string[] rawParams = rawData.Split('&'); 97 foreach (string param in rawParams) 98 { 99 string[] kvPair = param.Split('='); 100 string key = kvPair[0]; 101 string value = HttpUtility.UrlDecode(kvPair[1]); 102 rets[key] = value; 103 } 104 } 105 break; 106 case DataType.Get: 107 if (request.HttpMethod == "GET") 108 { 109 string[] keys = request.QueryString.AllKeys; 110 foreach (string key in keys) 111 { 112 rets[key] = request.QueryString[key]; 113 } 114 } 115 break; 116 } 117 return rets; 118 } 119 120 /// <summary> 121 /// 数据提交方式 122 /// </summary> 123 public enum DataType 124 { 125 Post, 126 Get, 127 } 128 129 130 }
测试调用类
1 public class TestHttp 2 { 3 THttpListener _HttpListener; 4 public TestHttp() 5 { 6 string[] strUrl = new string[] { "http://*/Test/" }; 7 _HttpListener = new THttpListener(strUrl); 8 _HttpListener.ResponseEvent += _HttpListener_ResponseEvent; 9 _HttpListener.Start(); 10 } 11 12 void _HttpListener_ResponseEvent(System.Net.HttpListenerContext ctx) 13 { 14 //直接获取数据 15 Dictionary<string, string> rets = _HttpListener.getData(ctx); 16 //获取get数据 17 Dictionary<string, string> retGets = _HttpListener.getData(ctx, THttpListener.DataType.Get); 18 //获取post数据 19 Dictionary<string, string> retPosts = _HttpListener.getData(ctx, THttpListener.DataType.Post); 20 ResponseWrite(ctx.Request.AcceptTypes[0], "Ret", ctx.Response); 21 } 22 23 static void ResponseWrite(string type, string msg, System.Net.HttpListenerResponse response) 24 { 25 //使用Writer输出http响应代码 26 using (System.IO.StreamWriter writer = new System.IO.StreamWriter(response.OutputStream, new UTF8Encoding())) 27 { 28 response.ContentType = type + ";charset=utf-8"; 29 writer.WriteLine(msg); 30 writer.Close(); 31 response.Close(); 32 } 33 } 34 }
当我们在服务程序或者后台程序需要开启对http的监听,来获取提交数据,但是又不能web服务器来挂在的程序,
转载于:https://www.cnblogs.com/shizuchengxuyuan/p/4329012.html
C# 控制台或者winform程序开启http的监听状态相关推荐
- C++开启后台线程监听控制台输入实现按任意键退出
//通过开启后台线程监听控制台输入来实现按任意键退出 //也可以自行修改成其他键 vector<thread> threads; threads.push_back(thread([]() ...
- Uniapp-微信小程序实现全局事件监听并进行数据埋点
Uniapp-微信小程序实现全局事件监听并进行数据埋点 零.前言 最近接到需求,领导希望使用微信开放平台上免费的We分析进行数据埋点,但又不希望在现有uniapp开发的微信小程序代码上做侵入式修改,笔 ...
- oracle11g监听程序启动,Oracle11g无监听程序解决办法
Oracle11g无监听程序解决办法 一.监听器(LISTENER) 监听器是Oracle基于服务器端的一种网络服务,主要用于监听客户端向数据库服务器端提出的连接请求.既然是基于服务器端的服务,那么它 ...
- 小程序组件中的监听事件
小程序组件中的监听事件 需求: 微信小程序中,如果进行使用了component级的组件的话,在一些情况下,父组件中使页面中的数据进行变化,子组件中 的数据不会一起变化,由此可以使用该方法 方法: 使用 ...
- 微信小程序实现watch属性监听数据变化
Vue 提供了一种通用的方式来观察和响应 Vue 实例上的数据变动:监听属性 watch. 虽然watch的滥用会导致性能不佳,但在一些情况下我们还是需要watch,使得代码更加简洁.逻辑更加清晰(其 ...
- 链接oracle 无监听程序,连接ORACLE 无监听程序
首先检查 计算机管理 -> 服务 -> OracleOraDa10g_home1TNSListener 是否启动,最好重启试试. 再检查其他服务是否正常.如果没有问题还是无法连接. 在 ...
- android监听程序被杀死,Android 监听主进程被杀
当按多任务键时,然后清除所有程序或者杀死单个程序时,如果要监听这个动作的话,可以在一个service里监听. 效果如下: 可以看到,在多任务窗口中,左滑结束进程和清除所有进程后,都会自己再打开应用,代 ...
- 开启1521端口监听_解决Oracle服务端1521端口无法telnet,服务名未开启监听问题
场景:oracle服务安装在windows本地,oracle客户端在虚拟机中,使用虚拟机连接windows的oracle数据库. 问题1:使用虚拟机telnet我本地oracle1521端口,不通 解 ...
- concurrently同时开启多个监听服务
当我们使用nodejs和vue混合开发的时候.当要同时启动后台服务,和前端服务的时候,我们可以使用concurrently 一.安装concurrently包 npm install concurre ...
最新文章
- [译稿]同步复制提议 2010-09
- sftp工具都有哪些_色彩校正的工具都有哪些?
- Python初探---2x版本与3x版本的区别
- python的第三方库-Python第三方库安装和卸载
- (补充)爬取大西洋月刊并调用彩云小译翻译 API 脚本
- python输出字典的前十项,从字典列表中获取前5个值?
- java.util.concurrent 多线程框架
- MySQL基础篇(02):从五个维度出发,审视表结构设计
- 微信小程序开发教程第八章:微信小程序分组开发与左滑功能实现
- 小C语言程序----词法分析程序输出单词
- bzoj 2151 种树 —— 思路+链表
- es文件浏览器访问win10局域网共享文件能看见共享文件夹但是点击文件夹无反应
- 安装了jdk和jre无法打开jar文件(测试过多个jdk版本和win系统,绝对百试百灵)
- VMware14安装步骤
- 关于微信双开后,王者荣耀默认只能打开微信主应用问题
- Thinkcmf - 微信公众号开发 -1
- 从零开始制作一个飞机大战类型的射击游戏
- void test();
- 链游知识01:同质化和非同质化资产标准是什么?
- Win10 Version 1803 四月更新正式版 ISO 镜像下载
热门文章
- 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
- uni-app文档需要注意细节点
- 前端学习(3350):数组方法的运用和数值join
- 前端学习(3313):redux的基本操作
- Taro+react开发(17)--赋值错误回显异常
- 前端学习(2945):首页搭建
- [html] 如何使用html5进行图片压缩上传?
- [软技能] png-8和png-24有什么区别?
- [html] 一个标签上同时出现三个或多个class属性,请问它的渲染顺序是怎样的?
- [html] 解释下你对GBK和UTF-8的理解?并说说页面上产生乱码的可能原因