【无标题】

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

注意:该类仅在运行 Windows XP SP2 或 Windows Server 2003 操作系统的计算机上可用。

使用Http服务一般步骤如下:

创建一个HTTP侦听器对象并初始化
添加需要监听的URI 前缀
开始侦听来自客户端的请求
处理客户端的Http请求
关闭HTTP侦听器
其中3,4两步可以循环处理,以提供多客户多次请求的服务。

第一步:创建一个HTTP侦听器对象

创建HTTP侦听器对象只需要新建一个HttpListener对象即可。

HttpListener listener = new HttpListener();

第二步:初始化

添加需要监听的URL范围至listener.Prefixes中,可以通过如下函数实现:
listener.Prefixes.Add(prefix) //prefix必须以’/'结尾
调用listener.Start()实现端口的绑定,并开始监听客户端的需求。

第三步:接受HTTP请求

在.net2.0中,通过HttpListenerContext对象提供对HttpListener类使用的请求和响应对象的访问。

获取HttpListenerContext的最简单方式如下:

HttpListenerContext context = listener.GetContext();

该方法将阻塞调用函数至接收到一个客户端请求为止,如果要提高响应速度,

可使用异步方法listener.BeginGetContext()来实现HttpListenerContext对象的获取。

第四步:处理HTTP请求

获取HttpListenerContext后,可通过Request属性获取表示客户端请求的对象,通过Response属性取表示 HttpListener 将要发送到客户端的响应的对象。

HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;

这里的HttpListenerRequest对象和HttpListenerResponse对象和Asp中的Request和Response的使用方式类似,这里就不多说了,具体的使用可以参看下面的例子。

第五步:关闭HTTP侦听器

通过调用listener.Stop()函数即可关闭侦听器,并释放相关资源

控制监听HTTP请求

#region 控制监听

        //开启监听
        private void btnStart_Click(object sender, EventArgs e)
        {
            //获取监听的多个地址
            string ipAddress1 = txtIPAddress1.Text.Trim();
            string ipAddress2 = txtIPAddress2.Text.Trim();

            // 注意前缀必须以 / 正斜杠结尾
            string[] prefixes = new string[] { ipAddress1, ipAddress2 };
            HttpListenerServer httpListenerServer = new HttpListenerServer();
            try
            {
                // 检查系统是否支持
                if (!HttpListener.IsSupported)
                {
                    throw new ArgumentException("使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
                }
                else
                { 
                    if (prefixes == null || prefixes.Length == 0)
                        throw new ArgumentException("缺少地址参数:prefixes");
                    else
                    {
                        //启动监听 // 创建监听器.
                        _listener = new HttpListener();
                        httpListenerServer.Start(_listener, prefixes);
                        lblListen.Text = "启用HttpListener监听成功!"; 
                    }
                }
            }
            catch (Exception ex)
            { 
                MessageBox.Show(ex.Message);
            } 
        }

        //关闭监听
        private void btnClose_Click(object sender, EventArgs e)
        {
            if (_listener != null)
            {
                _listener.Close();
                lblListen.Text = "停止HttpListener监听成功!"; 
            }
        }

        #endregion

处理请求数据

using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks; 

namespace WFHttpServer
{
    /// <summary>
    ///  通过HttpListener实现简单的http服务器
    /// </summary>
    public class HttpListenerServer
    {
        /// <summary>
        /// 启动监听
        /// </summary>
        /// <param name="prefixes">监听的多个地址</param>
        public void Start(HttpListener _listener, string[] prefixes)
        { 
            // 增加监听的前缀
            foreach (string s in prefixes)
                _listener.Prefixes.Add(s);

            _listener.Start(); //开始监听
            _listener.BeginGetContext(GetContextCallBack, _listener);
        }

        private void GetContextCallBack(IAsyncResult ar)
        {
            try
            {
                HttpListener _listener = ar.AsyncState as HttpListener;
                if (_listener.IsListening)
                {
                    HttpListenerContext context = _listener.EndGetContext(ar);
                    _listener.BeginGetContext(new AsyncCallback(GetContextCallBack), _listener);

                    #region 解析Request请求

                    HttpListenerRequest request = context.Request;
                    string content = "";
                    switch (request.HttpMethod)
                    {
                        case "POST":
                            {
                                Stream stream = context.Request.InputStream;
                                StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                                content = reader.ReadToEnd();

                                //模拟接受的数据:将接收的字符串内容进行json反序列号为对象
                                TestValue tv = JsonConvert.DeserializeObject<TestValue>(content); 
                                //根据需求做相应操作
                            }
                            break;
                        case "GET":
                            {
                                var data = request.QueryString;
                            }
                            break;
                    }

                    #endregion

                    #region 构造Response响应

                    HttpListenerResponse response = context.Response; 
                    response.StatusCode = (int)HttpStatusCode.OK;
                    response.ContentType = "application/json;charset=UTF-8";
                    response.ContentEncoding = Encoding.UTF8;
                    response.AppendHeader("Content-Type", "application/json;charset=UTF-8");

                    //模拟返回的数据:Json格式
                    var abcOject = new
                    {
                        code = "200",
                        description = "success",
                        data = "time=" + DateTime.Now
                    };
                    string responseString = JsonConvert.SerializeObject(abcOject,
                        new JsonSerializerSettings()
                        {
                            StringEscapeHandling = StringEscapeHandling.EscapeNonAscii
                        });

                    using (StreamWriter writer = new StreamWriter(response.OutputStream, Encoding.UTF8))
                    {
                        writer.Write(responseString);
                        writer.Close();
                        response.Close();
                    }

                    #endregion

                }
            }
            catch (Exception ex)
            {
                throw new ArgumentException(ex.Message);
            }
        }
    }


    //用于json反序列化获取的测试实体类
    public class TestValue
    {
        public int id { get; set; }
        public string name { get; set; }
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值