【httplistener监听获取Post请求参数】

来源:互联网 发布:淘宝宝贝图片怎么修改 编辑:程序博客网 时间:2024/05/22 17:25
    

【httplistener监听获取Post请求参数】

标签: HttpListener
455人阅读 评论(0)收藏举报
本文章已收录于:
分类:
作者同类文章X
    作者同类文章X

      使用httplistener监听来自客户端的http请求,对于Get请求的数据可以通过Request.QueryString["参数"]获取

      而对于来自客户端的Post请求则不能使用Request[""]获取,需要将获取分析请求流中的数据拿到参数

      [csharp] view plain copy print?在CODE上查看代码片派生到我的代码片
      1. using System;  
      2. using System.Collections.Generic;  
      3. using System.IO;  
      4. using System.Linq;  
      5. using System.Net;  
      6. using System.Text;  
      7. using System.Threading.Tasks;  
      8.   
      9. namespace HttpListenerPost  
      10. {  
      11.     /// <summary>  
      12.     /// HttpListenner监听Post请求参数值实体  
      13.     /// </summary>  
      14.     public class HttpListenerPostValue  
      15.     {  
      16.         /// <summary>  
      17.         /// 0=> 参数  
      18.         /// 1=> 文件  
      19.         /// </summary>  
      20.         public int type = 0;  
      21.         public string name;  
      22.         public byte[] datas;  
      23.     }  
      24.   
      25.     /// <summary>  
      26.     /// 获取Post请求中的参数和值帮助类  
      27.     /// </summary>  
      28.     public class HttpListenerPostParaHelper  
      29.     {  
      30.         private HttpListenerContext request;  
      31.   
      32.         public HttpListenerPostParaHelper(HttpListenerContext request)  
      33.         {  
      34.             this.request = request;  
      35.         }  
      36.   
      37.         private bool CompareBytes(byte[] source, byte[] comparison)  
      38.         {  
      39.             try  
      40.             {  
      41.                 int count = source.Length;  
      42.                 if (source.Length != comparison.Length)  
      43.                     return false;  
      44.                 for (int i = 0; i < count; i++)  
      45.                     if (source[i] != comparison[i])  
      46.                         return false;  
      47.                 return true;  
      48.             }  
      49.             catch  
      50.             {  
      51.                 return false;  
      52.             }  
      53.         }  
      54.   
      55.         private byte[] ReadLineAsBytes(Stream SourceStream)  
      56.         {  
      57.             var resultStream = new MemoryStream();  
      58.             while (true)  
      59.             {  
      60.                 int data = SourceStream.ReadByte();  
      61.                 resultStream.WriteByte((byte)data);  
      62.                 if (data == 10)  
      63.                     break;  
      64.             }  
      65.             resultStream.Position = 0;  
      66.             byte[] dataBytes = new byte[resultStream.Length];  
      67.             resultStream.Read(dataBytes, 0, dataBytes.Length);  
      68.             return dataBytes;  
      69.         }  
      70.   
      71.         /// <summary>  
      72.         /// 获取Post过来的参数和数据  
      73.         /// </summary>  
      74.         /// <returns></returns>  
      75.         public List<HttpListenerPostValue> GetHttpListenerPostValue()  
      76.         {  
      77.             try  
      78.             {  
      79.                 List<HttpListenerPostValue> HttpListenerPostValueList = new List<HttpListenerPostValue>();  
      80.                 if (request.Request.ContentType.Length > 20 && string.Compare(request.Request.ContentType.Substring(0, 20), "multipart/form-data;"true) == 0)  
      81.                 {  
      82.                     string[] HttpListenerPostValue = request.Request.ContentType.Split(';').Skip(1).ToArray();  
      83.                     string boundary = string.Join(";", HttpListenerPostValue).Replace("boundary=""").Trim();  
      84.                     byte[] ChunkBoundary = Encoding.UTF8.GetBytes("--" + boundary + "\r\n");  
      85.                     byte[] EndBoundary = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n");  
      86.                     Stream SourceStream = request.Request.InputStream;  
      87.                     var resultStream = new MemoryStream();  
      88.                     bool CanMoveNext = true;  
      89.                     HttpListenerPostValue data = null;  
      90.                     while (CanMoveNext)  
      91.                     {  
      92.                         byte[] currentChunk = ReadLineAsBytes(SourceStream);  
      93.                         if (!Encoding.UTF8.GetString(currentChunk).Equals("\r\n"))  
      94.                             resultStream.Write(currentChunk, 0, currentChunk.Length);  
      95.                         if (CompareBytes(ChunkBoundary, currentChunk))  
      96.                         {  
      97.                             byte[] result = new byte[resultStream.Length - ChunkBoundary.Length];  
      98.                             resultStream.Position = 0;  
      99.                             resultStream.Read(result, 0, result.Length);  
      100.                             CanMoveNext = true;  
      101.                             if (result.Length > 0)  
      102.                                 data.datas = result;  
      103.                             data = new HttpListenerPostValue();  
      104.                             HttpListenerPostValueList.Add(data);  
      105.                             resultStream.Dispose();  
      106.                             resultStream = new MemoryStream();  
      107.   
      108.                         }  
      109.                         else if (Encoding.UTF8.GetString(currentChunk).Contains("Content-Disposition"))  
      110.                         {  
      111.                             byte[] result = new byte[resultStream.Length - 2];  
      112.                             resultStream.Position = 0;  
      113.                             resultStream.Read(result, 0, result.Length);  
      114.                             CanMoveNext = true;  
      115.                             data.name = Encoding.UTF8.GetString(result).Replace("Content-Disposition: form-data; name=\"""").Replace("\"""").Split(';')[0];  
      116.                             resultStream.Dispose();  
      117.                             resultStream = new MemoryStream();  
      118.                         }  
      119.                         else if (Encoding.UTF8.GetString(currentChunk).Contains("Content-Type"))  
      120.                         {  
      121.                             CanMoveNext = true;  
      122.                             data.type = 1;  
      123.                             resultStream.Dispose();  
      124.                             resultStream = new MemoryStream();  
      125.                         }  
      126.                         else if (CompareBytes(EndBoundary, currentChunk))  
      127.                         {  
      128.                             byte[] result = new byte[resultStream.Length - EndBoundary.Length - 2];  
      129.                             resultStream.Position = 0;  
      130.                             resultStream.Read(result, 0, result.Length);  
      131.                             data.datas = result;  
      132.                             resultStream.Dispose();  
      133.                             CanMoveNext = false;  
      134.                         }  
      135.                     }  
      136.                 }  
      137.                 return HttpListenerPostValueList;  
      138.             }  
      139.             catch (Exception ex)  
      140.             {  
      141.                 return null;  
      142.             }  
      143.         }  
      144.     }  
      145. }  
      开启监听,获取Post请求的参数
      [csharp] view plain copy print?在CODE上查看代码片派生到我的代码片
      1. class Program  
      2.    {  
      3.        private static HttpListener httpPostRequest = new HttpListener();  
      4.   
      5.        static void Main(string[] args)  
      6.        {  
      7.            httpPostRequest.Prefixes.Add("http://10.0.0.217:30000/posttype/");  
      8.            httpPostRequest.Start();  
      9.   
      10.            Thread ThrednHttpPostRequest = new Thread(new ThreadStart(httpPostRequestHandle));  
      11.            ThrednHttpPostRequest.Start();  
      12.        }  
      13.   
      14.        private static void httpPostRequestHandle()  
      15.        {  
      16.            while (true)  
      17.            {  
      18.                HttpListenerContext requestContext = httpPostRequest.GetContext();  
      19.                Thread threadsub = new Thread(new ParameterizedThreadStart((requestcontext) =>  
      20.                {  
      21.                    HttpListenerContext request = (HttpListenerContext)requestcontext;  
      22.   
      23.                    //获取Post请求中的参数和值帮助类  
      24.                    HttpListenerPostParaHelper httppost=new HttpListenerPostParaHelper (request);  
      25.                    //获取Post过来的参数和数据  
      26.                    List<HttpListenerPostValue> lst=httppost.GetHttpListenerPostValue();  
      27.   
      28.                    string userName = "";  
      29.                    string password = "";  
      30.                    string suffix = "";  
      31.                    string adType = "";  
      32.                      
      33.                    //使用方法  
      34.                    foreach (var key in lst)  
      35.                    {  
      36.                        if (key.type == 0)  
      37.                        {  
      38.                            string value = Encoding.UTF8.GetString(key.datas).Replace("\r\n""");  
      39.                            if (key.name == "username")  
      40.                            {  
      41.                                userName = value;  
      42.                                Console.WriteLine(value);  
      43.                            }  
      44.                            if (key.name == "password")  
      45.                            {  
      46.                                password = value;  
      47.                                Console.WriteLine(value);  
      48.                            }  
      49.                            if (key.name == "suffix")  
      50.                            {  
      51.                                suffix = value;  
      52.                                Console.WriteLine(value);  
      53.                            }  
      54.                            if (key.name == "adtype")  
      55.                            {  
      56.                                adType = value;  
      57.                                Console.WriteLine(value);  
      58.                            }     
      59.                        }  
      60.                        if (key.type == 1)  
      61.                        {  
      62.                            string fileName = request.Request.QueryString["FileName"];  
      63.                            if (!string.IsNullOrEmpty(fileName))  
      64.                            {  
      65.                                string filePath = AppDomain.CurrentDomain.BaseDirectory + DateTime.Now.ToString("yyMMdd_HHmmss_ffff") + Path.GetExtension(fileName).ToLower();  
      66.                                if (key.name == "File")  
      67.                                {  
      68.                                    FileStream fs = new FileStream(filePath, FileMode.Create);  
      69.                                    fs.Write(key.datas, 0, key.datas.Length);  
      70.                                    fs.Close();  
      71.                                    fs.Dispose();  
      72.                                }  
      73.                            }  
      74.                        }  
      75.                    }  
      76.   
      77.                    //Response  
      78.                    request.Response.StatusCode = 200;  
      79.                    request.Response.Headers.Add("Access-Control-Allow-Origin""*");  
      80.                    request.Response.ContentType = "application/json";  
      81.                    requestContext.Response.ContentEncoding = Encoding.UTF8;  
      82.                    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(new {success="true",msg="提交成功" }));  
      83.                    request.Response.ContentLength64 = buffer.Length;  
      84.                    var output = request.Response.OutputStream;  
      85.                    output.Write(buffer, 0, buffer.Length);  
      86.                    output.Close();  
      87.                }));  
      88.                threadsub.Start(requestContext);  
      89.            }  
      90.        }  
      使用谷歌请求插件进行post请求,上传了文件,获取到了post参数.

      0
      0
       
       

      我的同类文章


      0 0
      原创粉丝点击