C# HttpListener 的使用方法
关于监听回调两次的原因,可能是因为重新监听导致的,所以查到微软上面的解析是说
BeginGetContext方法开始异步 (非阻塞) 调用以接收传入的客户端请求。 在调用此方法之前,必须调用 Start 方法,并添加至少一个统一资源标识符 (uri) 前缀,以便通过将 uri 字符串添加到属性返回的来侦听 HttpListenerPrefixCollection Prefixes 。
必须通过调用方法完成异步操作 EndGetContext 。 通常,方法由 callback 委托调用。
操作完成时,此方法不会被阻止。 若要获取传入请求并在操作完成之前一直阻止,请调用 GetContext 方法。
有关使用异步编程模型的详细信息,请参阅 以异步方式调用同步方法
我的猜测是这个
下面是写的一个HttpListener 帮助类
public class HttpListenerServer : IDisposable
{
private readonly HttpListener _listener; public HttpListenerServer(string[] prefixes)
{ // 检查系统是否支持
if (!HttpListener.IsSupported)
{
throw new ArgumentException("使用 该功能的系统 必须为 Windows XP SP2 或 Server 2003 以上系统!");
}
if (prefixes == null || prefixes.Length == 0)
{
throw new ArgumentException("请填写监听地址");
}
_listener = new HttpListener();
foreach (string s in prefixes)
{
_listener.Prefixes.Add(s);
}
_listener.Start();
_listener.BeginGetContext(new AsyncCallback(GetContextCallBack), _listener);
}
public void Dispose()
{
try
{
if (_listener != null)
{
_listener.Stop();
_listener.Close();
_listener.Abort();
}
RequestHandlerEven = null;
}
catch (Exception)
{ }
} public delegate object RequestHandler(HttpListenerRequest request);
public event RequestHandler RequestHandlerEven;
private void GetContextCallBack(IAsyncResult ar)
{
try
{
HttpListener httplis = ar.AsyncState as HttpListener;
if (httplis.IsListening)
{
HttpListenerContext context = httplis.EndGetContext(ar);
#region 解析Request请求
object resData = null;
HttpListenerRequest request = context.Request;
if (RequestHandlerEven != null)
{
resData = RequestHandlerEven(request);
}
else
{
resData = new
{
code = "200",
description = "成功",
data = "接收数据完成,时间:=" + DateTime.Now
};
}
#endregion 解析Request请求
#region 构造Response响应 using (HttpListenerResponse response = context.Response)
{
response.ContentEncoding = Encoding.UTF8;
response.ContentType = "application/json;charset=UTF-8";
response.AppendHeader("Content-Type", "application/json;charset=UTF-8");
try
{
response.StatusCode = (int)HttpStatusCode.OK;
string responseString = JsonConvert.SerializeObject(resData, new JsonSerializerSettings() { StringEscapeHandling = StringEscapeHandling.EscapeNonAscii });
using (StreamWriter writer = new StreamWriter(response.OutputStream, Encoding.UTF8))
{
writer.Write(responseString);
writer.Close();
response.Close();
}
}
catch (Exception ex)
{
response.StatusCode = (int)HttpStatusCode.NotFound;
response.StatusDescription = "404";
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"在接收数据时发生错误:{ex.ToString()}");
//把服务端错误信息直接返回可能会导致信息不安全,此处仅供参考
var returnByteArr = Encoding.UTF8.GetBytes($"在接收数据时发生错误:{ex.ToString()}");//设置客户端返回信息的编码
using (var stream = response.OutputStream)
{
//把处理信息返回到客户端
stream.Write(returnByteArr, 0, returnByteArr.Length);
stream.Close();
response.Close();
}
}
}
#endregion 构造Response响应
httplis.GetContext();
_listener.BeginGetContext(new AsyncCallback(GetContextCallBack), _listener);
}
}
catch (Exception ex)
{
throw new ArgumentException(ex.Message);
}
} }
C# HttpListener 的使用方法的更多相关文章
- 学习ASP.NET Core, 怎能不了解请求处理管道[3]: 自定义一个服务器感受一下管道是如何监听、接收和响应请求的
我们在<服务器在管道中的"龙头"地位>中对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了介绍,为了让读者朋友们对管道中的服务器具有更 ...
- 如果你想深刻理解ASP.NET Core请求处理管道,可以试着写一个自定义的Server
我们在上面对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了详细介绍(<聊聊ASP.NET Core默认提供的这个跨平台的服务器——KestrelServer& ...
- ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?
我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但是就具体的实现来说,由于其中涉及很多对象的交互,我想很少人能够地把它弄清楚.为了让读者 ...
- 自定义的Server
自定义的Server 我们在上面对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了详细介绍(<聊聊ASP.NET Core默认提供的这个跨平台的服务器——Kes ...
- 管道是如何处理HTTP请求的?
管道是如何处理HTTP请求的? 我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但是就具体的实现来说,由于其中涉及很多对象的交互,我想很 ...
- javaSE27天复习总结
JAVA学习总结 2 第一天 2 1:计算机概述(了解) 2 (1)计算机 2 (2)计算机硬件 2 (3)计算机软件 2 (4)软件开发(理解) 2 (5) ...
- 通过HttpListener实现简单的Http服务
使用HttpListener实现简单的Http服务 HttpListener提供一个简单的.可通过编程方式控制的 HTTP 协议侦听器.使用它可以很容易的提供一些Http服务,而无需启动IIS这类大型 ...
- atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty HttpListener
atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty HttpListener 1. 自定义web服务器的实现方案,基于原始socket vs ...
- 基于HttpListener的web服务器
写在前面 前面两篇文章分别介绍了基于原始socket的web服务器和基于tcpListener的web服务器,本篇文章将继续介绍另外一种基于HttpListener的. HttpListener Ht ...
- HttpListener 实现web服务端
1. using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syste ...
随机推荐
- 记一次 .NET某云HIS系统 CPU爆高分析
一:背景 1. 讲故事 年前有位朋友找到我,说他们的系统会偶发性的CPU爆高,有时候是爆高几十秒,有时候高达一分多钟,自己有一点分析基础,但还是没找到原因,让我帮忙看下怎么回事? 二:CPU爆高分析 ...
- 🎀idea-java序列化serialversionUID自动生成
简介 java.io.Serializable 是 Java 中的一个标记接口(marker interface),它没有任何方法或字段.当一个类实现了 Serializable 接口,那么这个类的对 ...
- 在线modbus RTU报文解析器 报文解析工具
本文分享一个在线Modbus RTU报文解析器: 网址:https://www.bais.top/tools/modbusRTU/ 网站干净简洁: 如图: 集成了CRC校验,若报文不对则不会进行解析 ...
- 亚马逊aws_access_key_id和aws_secret_access_key利用
00X01 信息泄露 敏感信息泄露,例如环境变量.例如,为了配置AWS CLI,需要设置以下环境变量: $ export AWS_ACCESS_KEY_ID=AKISIOSFODNN7EXAMPLE ...
- 通用的servlet
1 通用的servlet实现的原理 2 实例 2.1 目录结构 2.2 BaseServlet.java 2.3 ServletDemo.java 2.4 index.html 2.5 test.ht ...
- 【ROS】4.1 Turtlebot3仿真Waffle循线跟踪
原视频 本节内容较多,请根据左侧目录针对性阅读. 一.准备工作 这一章我们先用gazebo仿真做,不使用真小车,使用的是Waffle模型. 需要下载的库gazebo-ros.turtlebot3_si ...
- .NET 10 Preview 4中ASP.NET Core 改进
.NET团队在5月13日发布了.NET 10 Preview 4: https://devblogs.microsoft.com/dotnet/dotnet-10-preview-4/.该版本虽无突破 ...
- React-Native开发鸿蒙NEXT-蓝牙与图片处理的更正补充
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- MyBatis常见面试题:通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
MyBatis常见面试题:通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗? Dao接口即Mapper接 ...
- Java 验证电子邮箱是否合法
工作中,常常遇到校验电子邮箱字符串是否符合规范的需求,这里提供如下两个基于正则表达式的校验方法: public static final String EMAIL_REGEX_DEFAULT = &q ...