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 ...
 
随机推荐
- datasnap的Restful的接口方法
			
//Restful接口测试 //GET function Test(Value: string): string; //POST function updateTest(Value: string; ...
 - SpringSecurity5(13-核心组件和认证流程)
			
SecurityContextHolder SecurityContextHolder 持有的是安全上下文的信息,当前操作的用户是谁,用户是否已经被认证,他拥有哪些角色权限等,这些都被保存在 Secu ...
 - Spring底层AOP代码实现
			
一. AOP功能测试 ①. pom.xml 依赖导入 ②. 目标类 ③. 切面类 ④. 配置类 ⑤. 测试类 二. AOP原理-@EnableAspectJAutoProxy AOP原理:[看给容器中 ...
 - Asp.net mvc基础(十二)过滤器Filter
			
AOP(面向切面编程)是一种架构思想,用于把公共的逻辑放到一个单独的地方,这样就不用每个地方都写重复的代码了.相当于:一夫当关,万夫莫开 在Asp.net mvc中提供了四种过滤器接口实现了这种AOP ...
 - VUE——环境搭建
			
VUE--环境搭建 npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资源的合并和打包. vue-cli ...
 - Alembic迁移脚本:让数据库变身时间旅行者
			
title: Alembic迁移脚本:让数据库变身时间旅行者 date: 2025/05/09 13:08:18 updated: 2025/05/09 13:08:18 author: cmdrag ...
 - Winform C#多显示器窗口控制详解
			
写Winform程序的时候,有将一个窗口放置到特定的显示器,并且全屏的需求.于是借此机会,好好研究了一番这个Screen类[1],总结了一些方法. Windows的窗口逻辑 首先我们需要知道窗口定位的 ...
 - ISCC区域赛wp
			
ISCC区域 Web 哪吒的试炼 根据吃藕猜测要传参food /?food=lotus root 来到下一关 f12看源码 发现disable,把这个属性删掉 <?php if (isset($ ...
 - 网络编程:CMD命令
			
要求: 写一个客户端程序和服务器程序,客户端程序连接上服务器之后,通过敲命令和服务器进行交互,支持的交互命令包括: pwd:显示服务器应用程序启动时的当前路径. cd:改变服务器应用程序的当前路径. ...
 - NewtonJsonConvert的比较好搭配使用
			
(1)与关键字冲突,解决办法加@ var a = new { @class=1, }; var d = JsonConvert.SerializeObject(a); Console.WriteLin ...