关于监听回调两次的原因,可能是因为重新监听导致的,所以查到微软上面的解析是说

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 的使用方法的更多相关文章

  1. 学习ASP.NET Core, 怎能不了解请求处理管道[3]: 自定义一个服务器感受一下管道是如何监听、接收和响应请求的

    我们在<服务器在管道中的"龙头"地位>中对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了介绍,为了让读者朋友们对管道中的服务器具有更 ...

  2. 如果你想深刻理解ASP.NET Core请求处理管道,可以试着写一个自定义的Server

    我们在上面对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了详细介绍(<聊聊ASP.NET Core默认提供的这个跨平台的服务器——KestrelServer& ...

  3. ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?

    我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但是就具体的实现来说,由于其中涉及很多对象的交互,我想很少人能够地把它弄清楚.为了让读者 ...

  4. 自定义的Server

    自定义的Server 我们在上面对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了详细介绍(<聊聊ASP.NET Core默认提供的这个跨平台的服务器——Kes ...

  5. 管道是如何处理HTTP请求的?

    管道是如何处理HTTP请求的? 我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但是就具体的实现来说,由于其中涉及很多对象的交互,我想很 ...

  6. javaSE27天复习总结

    JAVA学习总结    2 第一天    2 1:计算机概述(了解)    2 (1)计算机    2 (2)计算机硬件    2 (3)计算机软件    2 (4)软件开发(理解)    2 (5) ...

  7. 通过HttpListener实现简单的Http服务

    使用HttpListener实现简单的Http服务 HttpListener提供一个简单的.可通过编程方式控制的 HTTP 协议侦听器.使用它可以很容易的提供一些Http服务,而无需启动IIS这类大型 ...

  8. atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty  HttpListener

    atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty  HttpListener 1. 自定义web服务器的实现方案,基于原始socket vs   ...

  9. 基于HttpListener的web服务器

    写在前面 前面两篇文章分别介绍了基于原始socket的web服务器和基于tcpListener的web服务器,本篇文章将继续介绍另外一种基于HttpListener的. HttpListener Ht ...

  10. HttpListener 实现web服务端

    1. using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syste ...

随机推荐

  1. 记一次 .NET某云HIS系统 CPU爆高分析

    一:背景 1. 讲故事 年前有位朋友找到我,说他们的系统会偶发性的CPU爆高,有时候是爆高几十秒,有时候高达一分多钟,自己有一点分析基础,但还是没找到原因,让我帮忙看下怎么回事? 二:CPU爆高分析 ...

  2. 🎀idea-java序列化serialversionUID自动生成

    简介 java.io.Serializable 是 Java 中的一个标记接口(marker interface),它没有任何方法或字段.当一个类实现了 Serializable 接口,那么这个类的对 ...

  3. 在线modbus RTU报文解析器 报文解析工具

    本文分享一个在线Modbus RTU报文解析器: 网址:https://www.bais.top/tools/modbusRTU/ 网站干净简洁: 如图: 集成了CRC校验,若报文不对则不会进行解析 ...

  4. 亚马逊aws_access_key_id和aws_secret_access_key利用

    00X01 信息泄露 敏感信息泄露,例如环境变量.例如,为了配置AWS CLI,需要设置以下环境变量: $ export AWS_ACCESS_KEY_ID=AKISIOSFODNN7EXAMPLE ...

  5. 通用的servlet

    1 通用的servlet实现的原理 2 实例 2.1 目录结构 2.2 BaseServlet.java 2.3 ServletDemo.java 2.4 index.html 2.5 test.ht ...

  6. 【ROS】4.1 Turtlebot3仿真Waffle循线跟踪

    原视频 本节内容较多,请根据左侧目录针对性阅读. 一.准备工作 这一章我们先用gazebo仿真做,不使用真小车,使用的是Waffle模型. 需要下载的库gazebo-ros.turtlebot3_si ...

  7. .NET 10 Preview 4中ASP.NET Core 改进

    .NET团队在5月13日发布了.NET 10 Preview 4: https://devblogs.microsoft.com/dotnet/dotnet-10-preview-4/.该版本虽无突破 ...

  8. React-Native开发鸿蒙NEXT-蓝牙与图片处理的更正补充

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  9. MyBatis常见面试题:通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

      MyBatis常见面试题:通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?   Dao接口即Mapper接 ...

  10. Java 验证电子邮箱是否合法

    工作中,常常遇到校验电子邮箱字符串是否符合规范的需求,这里提供如下两个基于正则表达式的校验方法: public static final String EMAIL_REGEX_DEFAULT = &q ...