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 ...
随机推荐
- leetcode每日一题:使所有字符相等的最小成本
题目 2712. 使所有字符相等的最小成本 给你一个下标从 0 开始.长度为 n 的二进制字符串 s ,你可以对其执行两种操作: 选中一个下标 i 并且反转从下标 0 到下标 i(包括下标 0 和下标 ...
- AR 智能生态鱼缸组态远控平台 | 图扑软件
在工业 4.0 和物联网技术的推动下,万物互联正重塑行业管理模式.组态远控系统作为高效管控的核心,打破了设备孤立状态,实现数据实时交互.以智能生态鱼缸为例,图扑软件低代码数字孪生平台通过集成前沿技术, ...
- Devops相关考试和认证
Devops相关考试和认证 Red Hat Certified System Administrator (RHCSA) 能够执行以下任务: 了解和运用必要的工具来处理文件.目录.命令行环境和文档 操 ...
- Windows管理小工具
Windows 管理小工具 概述 Windows 管理小工具 是一个基于批处理脚本的多功能工具,旨在帮助用户快速管理 Windows 系统中的常见设置和功能.通过简单的菜单操作,用户可以轻松完成 Wi ...
- 【笔记】Python3|爬虫处理网页数据异步加载问题(结合Selenium完成)
文章目录 问题描述 1. 结合Selenium.Edge解析该网站搜索页面的数据 2. 结合lxml解析网页数据 3. 附加:不是异步加载的网页,结合requests直接请求数据 问题描述 一些网站会 ...
- 反悔贪心&局部调整法学习笔记
一.什么是反悔贪心 反悔贪心就是在普通贪心的过程中"反悔",从而使得一些看似不太好贪心的题变成贪心可做题. 二.反悔贪心普遍流程 就是先使用一个好想的贪心策略,使用优先队列进行维护 ...
- Nacos源码—9.Nacos升级gRPC分析四
大纲 10.gRPC客户端初始化分析 11.gRPC客户端的心跳机制(健康检查) 12.gRPC服务端如何处理客户端的建立连接请求 13.gRPC服务端如何映射各种请求与对应的Handler处理类 1 ...
- RISC介绍
CPU中包含了控制部件和运算部件,即中央处理器.1971 年,Intel 将运算器和控制器集成在一个芯片上,称为 4004 微处理器,这标志着 CPU 的诞生.到了 1978 年,开发的 8086 处 ...
- C#交换方法指针
被引用的dll是testDllFr.dll,其代码为: namespace testDLLFr { public class TestA { public static void TestAM() { ...
- ✨生物大语言模型Evo2——解码基因密码的AI革命🚀
2025:生物AI的"DeepSeek时刻" 当整个中文互联网为国产大语言模型DeepSeek欢呼时,生命科学界正悄然掀起一场静默革命--由Arc Institute领衔,斯坦福. ...