1 public class THttpListener
     {
         HttpListener listerner;
         /// <summary>
         ///
         /// </summary>
         /// <param name="prefixes">格式 http://*/test/ </param>
         /// <param name="authent"></param>
         public THttpListener(string[] prefixes, AuthenticationSchemes authent = AuthenticationSchemes.Anonymous)
         {
             listerner = new HttpListener();
             listerner.AuthenticationSchemes = authent;//指定身份验证 Anonymous匿名访问
             foreach (var item in prefixes)
             {
                 listerner.Prefixes.Add(item);
                 Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + " : HttpListener:" + item);
             }
         }

         public delegate void ResponseEventArges(HttpListenerContext ctx);
         public event ResponseEventArges ResponseEvent;
         AsyncCallback ac = null;

         public void Start()
         {
             if (!listerner.IsListening)
             {
                 listerner.Start();
                 ac = new AsyncCallback(GetContextAsyncCallback);
                 listerner.BeginGetContext(ac, null);
                 Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + " : Start");
             }
         }

         /// <summary>
         /// 停止监听服务
         /// </summary>
         public void Stop()
         {
             listerner.Stop();
         }

         /// <summary>
         /// 收到监听请求回调
         /// </summary>
         /// <param name="ia"></param>
         public void GetContextAsyncCallback(IAsyncResult ia)
         {
             if (ia.IsCompleted)
             {
                 var ctx = listerner.EndGetContext(ia);
                 ctx.Response.StatusCode = ;
                 if (ResponseEvent != null)
                 {
                     ResponseEvent.BeginInvoke(ctx, null, null);
                 }
                 else
                 {
                     System.IO.BinaryWriter br = new System.IO.BinaryWriter(ctx.Response.OutputStream, new UTF8Encoding());
                     br.Write("error: 服务器未处理");
                     ctx.Response.Close();
                     br.Close();
                     br.Dispose();
                 }
             }
             listerner.BeginGetContext(ac, null);
         }

         public Dictionary<string, string> getData(System.Net.HttpListenerContext ctx)
         {
             var request = ctx.Request;
             if (request.HttpMethod == "GET")
             {
                 return getData(ctx, DataType.Get);
             }
             else
             {
                 return getData(ctx, DataType.Post);
             }
         }

         public Dictionary<string, string> getData(System.Net.HttpListenerContext ctx, DataType type)
         {
             var rets = new Dictionary<string, string>();
             var request = ctx.Request;
             switch (type)
             {
                 case DataType.Post:
                     if (request.HttpMethod == "POST")
                     {
                         string rawData;
                         using (var reader = new StreamReader(request.InputStream, request.ContentEncoding))
                         {
                             rawData = reader.ReadToEnd();
                         }
                         string[] rawParams = rawData.Split('&');
                         foreach (string param in rawParams)
                         {
                             string[] kvPair = param.Split('=');
                             ];
                             ]);
                             rets[key] = value;
                         }
                     }
                     break;
                 case DataType.Get:
                     if (request.HttpMethod == "GET")
                     {
                         string[] keys = request.QueryString.AllKeys;
                         foreach (string key in keys)
                         {
                             rets[key] = request.QueryString[key];
                         }
                     }
                     break;
             }
             return rets;
         }

         /// <summary>
         /// 数据提交方式
         /// </summary>
         public enum DataType
         {
             Post,
             Get,
         }

     }

测试调用类

 public class TestHttp
     {
         THttpListener _HttpListener;
         public TestHttp()
         {
             string[] strUrl = new string[] { "http://*/Test/" };
             _HttpListener = new THttpListener(strUrl);
             _HttpListener.ResponseEvent += _HttpListener_ResponseEvent;
             _HttpListener.Start();
         }

         void _HttpListener_ResponseEvent(System.Net.HttpListenerContext ctx)
         {
             //直接获取数据
             Dictionary<string, string> rets = _HttpListener.getData(ctx);
             //获取get数据
             Dictionary<string, string> retGets = _HttpListener.getData(ctx, THttpListener.DataType.Get);
             //获取post数据
             Dictionary<string, string> retPosts = _HttpListener.getData(ctx, THttpListener.DataType.Post);
             ResponseWrite(ctx.Request.AcceptTypes[], "Ret", ctx.Response);
         }

         static void ResponseWrite(string type, string msg, System.Net.HttpListenerResponse response)
         {
             //使用Writer输出http响应代码
             using (System.IO.StreamWriter writer = new System.IO.StreamWriter(response.OutputStream, new UTF8Encoding()))
             {
                 response.ContentType = type + ";charset=utf-8";
                 writer.WriteLine(msg);
                 writer.Close();
                 response.Close();
             }
         }
     }

当我们在服务程序或者后台程序需要开启对http的监听,来获取提交数据,但是又不能web服务器来挂在的程序,

C# 控制台或者winform程序开启http的监听状态的更多相关文章

  1. 监听程序未启动或数据库服务未注册到该监听程序。启动该监听程序并注册数据库服务 然后重新运行 em configuration assistant。

    在WIN 7/64Bit上安装ORACLE 11gR2后,管理网页Database Control(如:https://localhost:1158/em)始终登录不进去,总是说密码错误,使用配置工具 ...

  2. 利用 netsh 给 mysql 开启多端口监听

    利用 netsh 给 mysql 开启多端口监听 标题党,实际并不是真的多端口监听,只是端口转发而已. 由于某种特殊原因需要 mysql 服务器多个端口监听. mysql 服务器本身是不支持的,但可以 ...

  3. nc临时开启端口并监听

    port="6379 3306 27017 4505 4506 24007 24008 49152" #while true #do for i in $port do isexi ...

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

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

  5. Windows 8 应用程序前后台切换事件监听

    在一些情况下,我们需要监听应用程序切换到后台或者从后台切换至前台的事件,从而进行相关处理操作.支付宝应用锁屏(IOS,Android平台)的处理中就需要监听此事件,在用户将应用切换至后台一段时间后再切 ...

  6. 控制台或Winform程序中如何编码或解码Server.URLEncode

    原文发布时间为:2010-07-10 -- 来源于本人的百度文章 [由搬家工具导入] 在Asp.net中可以使用Server.HTMLEncode和Server.URLEncode 将文本或URL的特 ...

  7. 小程序组件中有bindinput监听报异常

    真机上有问题,ide上是没问题的,   组件有处理函数,结果异常说页面没有处理函数,加上处理函数后就不报异常了.

  8. docker开启远程tcp监听端口

    linux 测试成功 cat > /etc/systemd/system/docker.service.d/tcp.conf <<EOF [Service] ExecStart= E ...

  9. 解决windows7无法连接CentOS7系统中oracle问题:ORA-12514 TNS 监听程序当前无法识别

    linux开启后终端按下面输入(容易忘记,记录下): [oracle@localhost ~]$ lsnrctl stop                #先关闭监听服务 [oracle@localh ...

随机推荐

  1. 介绍Oedis - Redis OH/RM

    作死造轮子 Oedis是近段时间为了解决日志型数据如何与Entity Framework的查询整合的问题写的一个Redis的OH /RM.虽然Redis出来蛮久了,各路高手也都提出了实践方案,但是或许 ...

  2. 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存机制

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d3e3ab10c62013697408 作者:黄宁源 一,背景 Recy ...

  3. 2、CC2541芯片中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~

    本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...

  4. React Native01-开始 Windows环境安装配置篇

    转载本文章的童鞋请注明原链接. 查阅文档之类的资料,建议到 http://reactnative.cn/ 本人使用环境Win10. 在阅读本文之前,请了解我们安装React Native之前,要安装P ...

  5. IOS Socket 05-XMPP开始&安装服务器openfire&安装配置客户端

    1. 即时通讯技术简介(IM) 即时通讯技术(IM-Instant Messageing)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方 ...

  6. 一条Select语句丛生到死的处理过程

    以一条普通的“select * from table order by …”语句为例.图2-21中显示为该语句在数据库中各个组件之间的处理过程,各个步骤分别代表: (1)select语句通过网络传送给 ...

  7. 动手搭个wordpress

    看到很多人都是自己搭建博客服务器,然后一切都在自己的掌控之下,这样就不存在什么迁移,数据安全之类的问题,当然需要自己搞个空间了,不过现在都便宜的不行,$15/year,也是醉了.我不怎么写博客,但是个 ...

  8. Python数据类型之“文本序列(Text Sequence)”

    Python中的文本序列类型 Python中的文本数据由str对象或字符串进行处理. 1.字符串 字符串是Unicode码值的不可变序列.字符串字面量有多种形式: 单引号:'允许嵌入"双&q ...

  9. CAS原子锁 高效自旋无锁的正确用法

    "atomic_lock.h" #pragma once #ifndef _atomic_lock_h_include_ #define _atomic_lock_h_includ ...

  10. 微软BI 之SSIS 系列 - 使用 SQL Profilling Task (数据探测) 检测数据源数据

    开篇介绍 SQL Profilling Task 可能我们很多人都没有在 SSIS 中真正使用过,所以对于这个控件的用法可能也不太了解.那我们换一个讲法,假设我们有这样的一个需求 - 需要对数据库表中 ...