C# 控制台或者winform程序开启http的监听状态
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的监听状态的更多相关文章
- 监听程序未启动或数据库服务未注册到该监听程序。启动该监听程序并注册数据库服务 然后重新运行 em configuration assistant。
在WIN 7/64Bit上安装ORACLE 11gR2后,管理网页Database Control(如:https://localhost:1158/em)始终登录不进去,总是说密码错误,使用配置工具 ...
- 利用 netsh 给 mysql 开启多端口监听
利用 netsh 给 mysql 开启多端口监听 标题党,实际并不是真的多端口监听,只是端口转发而已. 由于某种特殊原因需要 mysql 服务器多个端口监听. mysql 服务器本身是不支持的,但可以 ...
- nc临时开启端口并监听
port="6379 3306 27017 4505 4506 24007 24008 49152" #while true #do for i in $port do isexi ...
- 微信小程序实现watch属性监听数据变化
Vue 提供了一种通用的方式来观察和响应 Vue 实例上的数据变动:监听属性 watch. 虽然watch的滥用会导致性能不佳,但在一些情况下我们还是需要watch,使得代码更加简洁.逻辑更加清晰(其 ...
- Windows 8 应用程序前后台切换事件监听
在一些情况下,我们需要监听应用程序切换到后台或者从后台切换至前台的事件,从而进行相关处理操作.支付宝应用锁屏(IOS,Android平台)的处理中就需要监听此事件,在用户将应用切换至后台一段时间后再切 ...
- 控制台或Winform程序中如何编码或解码Server.URLEncode
原文发布时间为:2010-07-10 -- 来源于本人的百度文章 [由搬家工具导入] 在Asp.net中可以使用Server.HTMLEncode和Server.URLEncode 将文本或URL的特 ...
- 小程序组件中有bindinput监听报异常
真机上有问题,ide上是没问题的, 组件有处理函数,结果异常说页面没有处理函数,加上处理函数后就不报异常了.
- docker开启远程tcp监听端口
linux 测试成功 cat > /etc/systemd/system/docker.service.d/tcp.conf <<EOF [Service] ExecStart= E ...
- 解决windows7无法连接CentOS7系统中oracle问题:ORA-12514 TNS 监听程序当前无法识别
linux开启后终端按下面输入(容易忘记,记录下): [oracle@localhost ~]$ lsnrctl stop #先关闭监听服务 [oracle@localh ...
随机推荐
- Java构建工具Ant小记(一)
Ant简介 Ant是基于java的构建工具.理论上来说它类似与make工具,但是却克服了make的一些固有的缺陷. 传统的Make是基于操作系统shell的构建工具,虽然也可以基于工作的os对make ...
- 软件工程day8
设计出一份demo.上报于组,等待修改意见. 色调为黑白灰,图像也很简洁,符合“快捷查询工具”的主题.
- PC版淘宝UWP揭秘
经过第一轮内测后的bug数量:65 2015/11/27 - bug数量 = 60 2015/11/30 - bug数量 = 53 2015/12/1 - bug数量 = 49 2015/12/2 - ...
- 学习设计模式第三 - 基础使用UML表示关系
面向对象的思想中存在如下几种关系,一般为了方便交流都使用UML的类图来展现类之间的关系.所以了解类图中符号的含义对看懂类图,尤其是用类图展示的设计模式很有帮助.下面依次介绍这几种关系 类继承关系 继承 ...
- 一天一小段js代码(no.4)
最近在看网上的前端笔试题,借鉴别人的自己来试一下: 题目: 写一段脚本,实现:当页面上任意一个链接被点击的时候,alert出这个链接在页面上的顺序号,如第一个链接则alert(1), 依次类推. 有一 ...
- onSingleTapUp()和onSingleTapConfirmed()的区别
onSingleTapUp() - 在按下并抬起时发生,只要符合这个条件就触发该函数,没有任何附加条件. onSingleTapConfirmed() 同上者,但有附加条件,就是Android会确保单 ...
- 这里有个坑---[NotMapped]不要忘了加
这里有个坑,我们定义实体的时候如果使用了在数据库没有的字段记得加[NotMapped]---------每一个遇到的坑总结后都是一比财富. 在项目中我们一般会使用EF等ORM框架来为我们服务,在ORM ...
- WebApi系列~实际项目中如何使用HttpClient向web api发异步Get和Post请求并且参数于具体实体类型
回到目录 本讲比较实际,在WEB端有一个Index和Create方法,用来从web api显示实体列表数据和向api插入实体对象,这就是以往的网站,只不过是把数据持久化过程放到了web pai上面,它 ...
- Fedora 24 install MySQL
Background I have work with mysql on the fedora OS, but currently fedora have no support mysql inste ...
- Atitit cnchar simp best list 汉字简化方案 最简化汉字256个
Atitit cnchar simp best list 汉字简化方案 最简化汉字256个 1.1. 最简化发音1 1.2. 根据笔画密度,删除了密度高的字..1 1.3. 使用同发音的英文字母等代 ...