点滴收获,成长源于足下的进步!
01,C#使用HttpListener创建最简易Http通讯服务器
1.简要介绍: HttpListener是一种可以实现简易Http协议的侦听器,可以实现对Http协议( GET、HEAD、POST、PUT、DELETE、TRACE 或 OPTIONS)的监听并将处理的结果返回 2.常用属性: MSDN介绍文档 -AuthenticationSchemes 说明: 对客户端进行身份验证的方式值为 AuthenticationSchemes的枚举值。 默认值是 Anonymous。 AuthenticationSchemes枚举值官方介绍:
枚举值 索引值 值含义
Anonymous 32768 指定匿名身份验证。
Basic 8 指定基本身份验证。
Digest 1 指定摘要式身份验证。
IntegratedWindowsAuthentication 6 指定 Windows 身份验证。
Negotiate 2 和客户端协商以确定身份验证方案。 如果客户端和服务器均支持 Kerberos,则使用 Kerberos;否则使用 NTLM。
None 0 不允许进行任何身份验证。 设置了此标志并请求 HttpListener 对象的客户端将始终会接收 403 Forbidden 状态。 当资源决不应该用于客户端时,请使用此标志。
Ntlm 4 指定 NTLM 身份验证。
- DefaultServiceNames
说明:使用该属性中ServiceNameCollection的获取由已注册前缀确定的服务提供程序名 (SPN) 的默认列表。 - IsListening
说明:获取一个bool值,指示 HttpListener 是否已启动。 - TimeoutManager
说明:设置各种超时 - Prefixes
说明:获取当前HttpListener 对象在经配置后要处理的 URI 前缀。
- HttpListener创建步骤:
Ⅰ,创建实例对象 Ⅱ,添加监听的端口或url Ⅲ,启动监听 Ⅳ,处理监听请求 Ⅴ,停止监听 - 代码
public class HttpService1
{
private static HttpService1 service = null;
public static HttpService1 CreateService
{
get
{
if (service == null)
{
return new HttpService1();
}
else
{
return service;
}
}
}
HttpListener httpListener = null;
bool isStarted = false;
public bool GetServiceStation { get { return isStarted; } }
public void StarService(string ip,string port)
{
try
{
if (httpListener != null)
{
if (httpListener.IsListening)
{
httpListener.Stop();
}
}
else
{
httpListener = new HttpListener();
}
string url = $"http://{ip}:{port}/";
httpListener = new HttpListener();
httpListener.Prefixes.Add(url);
httpListener.Start();
httpListener.BeginGetContext(Result, null);
}
catch (Exception ex)
{
throw new Exception($"创建{ip}:{port}服务失败!{Environment.NewLine}详细信息:{ex.Message}");
}
}
public void StopService()
{
httpListener.Close();
isStarted = httpListener.IsListening;
}
private void Result(IAsyncResult ar)
{
if (!httpListener.IsListening)
{
return;
}
httpListener.BeginGetContext(Result, httpListener);
lock (httpListener)
{
if (httpListener.IsListening)
{
var context = httpListener.EndGetContext(ar);
var request = context.Request;
var response = context.Response;
Encoding encoding = context.Request.ContentEncoding;
context.Response.ContentType = string.Format("text/plain;charset={0}", encoding.BodyName);
context.Response.AppendHeader("Access-Control-Allow-Origin", "*");
context.Response.AppendHeader("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token");
context.Response.AppendHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
context.Response.AppendHeader("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type");
context.Response.AppendHeader("Access-Control-Allow-Credentials", "true");
context.Response.ContentEncoding = encoding;
ProcessRequest(request, response, encoding);
}
}
}
private void ProcessRequest(HttpListenerRequest request, HttpListenerResponse response, Encoding encoding)
{
string ret = null;
string apiUrI = request.RawUrl;
switch (apiUrI)
{
case "/AAA/":
{
ret = "AAA OK";
}
break;
case "/BBB":
{
ret = "BBB OK";
}
break;
}
var returnByteArr = encoding.GetBytes(ret);
try
{
using (var stream = response.OutputStream)
{
stream.Write(returnByteArr, 0, returnByteArr.Length);
}
}
catch (Exception ex)
{
throw new Exception("处理请求出现异常异常信息:" + ex.Message);
}
}
}
水平有限,欢迎一起交流!!!
|