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的监听状态相关推荐

  1. C++开启后台线程监听控制台输入实现按任意键退出

    //通过开启后台线程监听控制台输入来实现按任意键退出 //也可以自行修改成其他键 vector<thread> threads; threads.push_back(thread([]() ...

  2. Uniapp-微信小程序实现全局事件监听并进行数据埋点

    Uniapp-微信小程序实现全局事件监听并进行数据埋点 零.前言 最近接到需求,领导希望使用微信开放平台上免费的We分析进行数据埋点,但又不希望在现有uniapp开发的微信小程序代码上做侵入式修改,笔 ...

  3. oracle11g监听程序启动,Oracle11g无监听程序解决办法

    Oracle11g无监听程序解决办法 一.监听器(LISTENER) 监听器是Oracle基于服务器端的一种网络服务,主要用于监听客户端向数据库服务器端提出的连接请求.既然是基于服务器端的服务,那么它 ...

  4. 小程序组件中的监听事件

    小程序组件中的监听事件 需求: 微信小程序中,如果进行使用了component级的组件的话,在一些情况下,父组件中使页面中的数据进行变化,子组件中 的数据不会一起变化,由此可以使用该方法 方法: 使用 ...

  5. 微信小程序实现watch属性监听数据变化

    Vue 提供了一种通用的方式来观察和响应 Vue 实例上的数据变动:监听属性 watch. 虽然watch的滥用会导致性能不佳,但在一些情况下我们还是需要watch,使得代码更加简洁.逻辑更加清晰(其 ...

  6. 链接oracle 无监听程序,连接ORACLE 无监听程序

    首先检查 计算机管理 -> 服务 ->  OracleOraDa10g_home1TNSListener  是否启动,最好重启试试. 再检查其他服务是否正常.如果没有问题还是无法连接. 在 ...

  7. android监听程序被杀死,Android 监听主进程被杀

    当按多任务键时,然后清除所有程序或者杀死单个程序时,如果要监听这个动作的话,可以在一个service里监听. 效果如下: 可以看到,在多任务窗口中,左滑结束进程和清除所有进程后,都会自己再打开应用,代 ...

  8. 开启1521端口监听_解决Oracle服务端1521端口无法telnet,服务名未开启监听问题

    场景:oracle服务安装在windows本地,oracle客户端在虚拟机中,使用虚拟机连接windows的oracle数据库. 问题1:使用虚拟机telnet我本地oracle1521端口,不通 解 ...

  9. concurrently同时开启多个监听服务

    当我们使用nodejs和vue混合开发的时候.当要同时启动后台服务,和前端服务的时候,我们可以使用concurrently 一.安装concurrently包 npm install concurre ...

最新文章

  1. [译稿]同步复制提议 2010-09
  2. sftp工具都有哪些_色彩校正的工具都有哪些?
  3. Python初探---2x版本与3x版本的区别
  4. python的第三方库-Python第三方库安装和卸载
  5. (补充)爬取大西洋月刊并调用彩云小译翻译 API 脚本
  6. python输出字典的前十项,从字典列表中获取前5个值?
  7. java.util.concurrent 多线程框架
  8. MySQL基础篇(02):从五个维度出发,审视表结构设计
  9. 微信小程序开发教程第八章:微信小程序分组开发与左滑功能实现
  10. 小C语言程序----词法分析程序输出单词
  11. bzoj 2151 种树 —— 思路+链表
  12. es文件浏览器访问win10局域网共享文件能看见共享文件夹但是点击文件夹无反应
  13. 安装了jdk和jre无法打开jar文件(测试过多个jdk版本和win系统,绝对百试百灵)
  14. VMware14安装步骤
  15. 关于微信双开后,王者荣耀默认只能打开微信主应用问题
  16. Thinkcmf - 微信公众号开发 -1
  17. 从零开始制作一个飞机大战类型的射击游戏
  18. void test();
  19. 链游知识01:同质化和非同质化资产标准是什么?
  20. Win10 Version 1803 四月更新正式版 ISO 镜像下载

热门文章

  1. 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
  2. uni-app文档需要注意细节点
  3. 前端学习(3350):数组方法的运用和数值join
  4. 前端学习(3313):redux的基本操作
  5. Taro+react开发(17)--赋值错误回显异常
  6. 前端学习(2945):首页搭建
  7. [html] 如何使用html5进行图片压缩上传?
  8. [软技能] png-8和png-24有什么区别?
  9. [html] 一个标签上同时出现三个或多个class属性,请问它的渲染顺序是怎样的?
  10. [html] 解释下你对GBK和UTF-8的理解?并说说页面上产生乱码的可能原因