IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> C#经验积累 -> 正文阅读

[系统运维]C#经验积累

点滴收获,成长源于足下的进步!

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 前缀。
  1. HttpListener创建步骤:
    Ⅰ,创建实例对象
    Ⅱ,添加监听的端口或url
    Ⅲ,启动监听
    Ⅳ,处理监听请求
    Ⅴ,停止监听
  2. 代码
  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;//创建HttpListener实例
        bool isStarted = false;//获取实例的监听状态

        /// <summary>
        /// 获取服务状态
        /// </summary>
        public bool GetServiceStation { get { return isStarted; } }
        /// <summary>
        /// 开启服务
        /// </summary>
        /// <param name="service"></param>
        public void StarService(string ip,string port)
        {
            try
            {
                if (httpListener != null)
                {
                    if (httpListener.IsListening)
                    {
                        httpListener.Stop();
                    }
                }
                else
                {
                    httpListener = new HttpListener();
                }
                //   string url = $"http://{127.0.0.1}:{7000}/{AAA}/";//监听127.0.0.1:7000/AAA/服务接口的请求
                string url = $"http://{ip}:{port}/";
                httpListener = new HttpListener();//初始化实例
                httpListener.Prefixes.Add(url);//添加监听接口
                httpListener.Start();//启动
                httpListener.BeginGetContext(Result, null);//处理请求数据
                //isStarted = httpListener.IsListening;//获取服务监听状态
            }
            catch (Exception ex)
            {
                throw new Exception($"创建{ip}:{port}服务失败!{Environment.NewLine}详细信息:{ex.Message}");
            }
        }
        /// <summary>
        /// 停止服务
        /// </summary>
        public void StopService()
        {
            httpListener.Close();
            isStarted = httpListener.IsListening;
        }
        /// <summary>
        /// 服务回调函数
        /// </summary>
        /// <param name="ar"></param>
        private void Result(IAsyncResult ar)
        {
            if (!httpListener.IsListening)//如果服务已停止则直接终止
            {
                return;
            }
            //继续异步监听
            httpListener.BeginGetContext(Result, httpListener);
            lock (httpListener)
            {
                if (httpListener.IsListening)
                {
                    //获得context对象
                    var context = httpListener.EndGetContext(ar);
                    var request = context.Request;//获取Request实例
                    var response = context.Response;//获取Response实例
                    Encoding encoding = context.Request.ContentEncoding;//获取请求的文本的编码格式
                    //设置Request Http报文头
                    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;//设置Request Http报文头编码格式
                    ProcessRequest(request, response, encoding);
                }
            }
        }
        /// <summary>
        /// 处理请求数据
        /// </summary>
        /// <param name="request"></param>
        /// <param name="response"></param>
        /// <param name="encoding"></param>
        private void ProcessRequest(HttpListenerRequest request, HttpListenerResponse response, Encoding encoding)
        {
            string ret = null;
            string apiUrI = request.RawUrl;//获取请求的接口路径(不包含服务IP和端口)
            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)//创建response的输出实例
                {
                    //把处理信息返回到客户端
                    stream.Write(returnByteArr, 0, returnByteArr.Length);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("处理请求出现异常异常信息:" + ex.Message);
            }
        }


    }

水平有限,欢迎一起交流!!!

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 15:13:03  更:2021-10-24 15:13:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:21:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码