`

Example: Receive HTTP Post via ASP.Net Generic Handler 转

 
阅读更多

假设我们要提供一个小小的服务,采用HTTP协议进行通讯,客户端 POST 一些数据到服务器上。客户端不一定是PC,更不一定会按照一个Web Form的格式来提交数据,它可能是一个运行在PC上的Desktop Application,也可能是一个移动设备。

 

服务器端接收这样的请求极其简单,下面寥寥数行代码即可实现:

在Web站点中新建一个Generic Handler(*.ashx),代码如下:

  1. <%@ WebHandler Language= "C#"  Class= "Echo"  %>  
  2.   
  3. using  System;  
  4. using  System.Web;  
  5. using  System.IO;  
  6.   
  7. public   class  Echo : IHttpHandler  
  8. {  
  9.     private  System.Text.Encoding DefaultEncoding = System.Text.Encoding.UTF8;  
  10.       
  11.     public   void  ProcessRequest (HttpContext context)  
  12.     {  
  13.         context.Response.ContentType = "text/plain" ;  
  14.         context.Response.ContentEncoding = DefaultEncoding;  
  15.   
  16.         Stream inputStream = context.Request.InputStream;  
  17.         using  (StreamReader reader =  new  StreamReader(inputStream, DefaultEncoding))  
  18.         {  
  19.             string  requestContent = reader.ReadToEnd();  
  20.             string  responseContent =  string .Format( "Received: {0} <== END" , requestContent);  
  21.               
  22.             context.Response.Write(responseContent);  
  23.         }  
  24.     }  
  25.   
  26.     public   bool  IsReusable  
  27.     {  
  28.         get  {  return   false ; }  
  29.     }  
  30. }  

然后我们写一个简单的客户端来测试它。在这个客户端里我们实现了一个类HttpClient来进行HTTP POST操作:
  1. // -----------------------------------------------------------------------   
  2. // <copyright file="HttpClient.cs" author="Yaping Xin">   
  3. // Http protocol client.   
  4. // </copyright>   
  5. // -----------------------------------------------------------------------   
  6.   
  7. namespace  ConsoleClient  
  8. {  
  9.     using  System;  
  10.     using  System.IO;  
  11.     using  System.Net;  
  12.     using  System.Text;  
  13.   
  14.     /// <summary>   
  15.     /// Http protocol client.   
  16.     /// </summary>   
  17.     public   class  HttpClient  
  18.     {  
  19.         /// <summary>   
  20.         /// Post data to specific url and get response content.   
  21.         /// </summary>   
  22.         /// <param name="url">the url to post</param>   
  23.         /// <param name="postData">post data</param>   
  24.         /// <returns>response content</returns>   
  25.         public   string  Post( string  url,  string  postData)  
  26.         {  
  27.             Uri uri = new  Uri(url);  
  28.             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);  
  29.             request.Method = "POST" ;  
  30.             request.ContentType = "application/x-www-form-urlencoded" ;  
  31.   
  32.             Encoding encoding = Encoding.UTF8;  
  33.             byte [] bytes = encoding.GetBytes(postData);  
  34.   
  35.             request.ContentLength = bytes.Length;  
  36.   
  37.             using  (Stream writer = request.GetRequestStream())  
  38.             {  
  39.                 writer.Write(bytes, 0, bytes.Length);  
  40.                 writer.Close();  
  41.             }  
  42.   
  43.             return   this .ReadResponse(request);;  
  44.         }  
  45.   
  46.         /// <summary>   
  47.         /// Read response content from http request result.   
  48.         /// </summary>   
  49.         /// <param name="request">http request object</param>   
  50.         /// <returns>response content.</returns>   
  51.         private   string  ReadResponse(HttpWebRequest request)  
  52.         {  
  53.             string  result =  string .Empty;  
  54.   
  55.             using  (HttpWebResponse response = (HttpWebResponse)request.GetResponse())  
  56.             {  
  57.                 using  (Stream responseStream = response.GetResponseStream())  
  58.                 {  
  59.                     using  (StreamReader reader =  new  StreamReader(responseStream, Encoding.UTF8))  
  60.                     {  
  61.                         result = reader.ReadToEnd();  
  62.                         reader.Close();  
  63.                     }  
  64.                 }  
  65.             }  
  66.   
  67.             return  result;  
  68.         }  
  69.     }  
  70. }  

然后我们这样就能得到HTTP POST的返回:

  1. // Replace the string content with your actual address please.   
  2. string  defaultUrl =  "http://ServerName:8081/WebPath/AnyService.ashx" ;  
  3.   
  4. HttpClient client = new  HttpClient();  
  5. string  response = client.Post(defaultUrl, @ "abc 123! 测试 @" );  
  6.   
  7. Console.OutputEncoding = System.Text.Encoding.UTF8;  
  8. Console.WriteLine(response);  


假设Client与Server两端都约定好采取某个格式对数据进行序列化与反序列化,例如都采用Json,客户端把对象通过Json封装后 Post给Server,Server再采用Json将对象从Json字符串中解析出来,这样进行数据传递是便利的。再假设我们要压缩传送出的数据量,那 么可以进行gzip压缩与解压。又假设我们要考虑安全性,那么我们可以在对象的结构中添加security token进行认证,以及采用某种加密算法对字符串进行加密与解密。怎么发挥就看您具体的应用了,构建一个属于您自己的轻量的service易如反掌。

 

分享到:
评论

相关推荐

    asp.net mvc handler

    asp.net mvc handler

    ASP.NET源码——利用handler生成静态页面的完整解决方案.zip

    ASP.NET源码——利用handler生成静态页面的完整解决方案.zip

    asp.net知识库

    ASP.NET: State Server Gems 完整的动态加载/卸载程序集的解决方案 从NUnit中理解.NET自定义属性的应用(转载) 如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件机制的简单实现 我对J2EE和.NET的一点理解 难分难舍...

    asp.net handler的使用源代码

    using System.Collections.Generic; using System.Text; using System.Web; using System.Web.SessionState; namespace MyHandler { /// /// 目的:实现一个简单的自定义HttpHandler容器 /// 作者:文野 /// ...

    基于ASP.NET和C#的Web应用程序设计源码

    包含177个文件,其中包括60个配置文件,53个C#源代码文件,17个ASPX页面文件,15个解决方案文件(.sln),15个项目文件(.csproj),10个JPEG图片文件,以及1个Git忽略文件和1个ASP.NET的Handler文件(ashx)。...

    了解ASP.NET底层架构

    这篇文章以非常底层的视角讲述了Web请求(request)在ASP.NET框架中是如何流转的,从Web服务器,通过ISAPI直到请求处理器(handler)和你的代码.看看在幕后都发生了些什么,不要再把ASP.NET看成一个黑盒了.

    用户注册及弹出式登录(ASP.NET,Jquery+ashx实现)

    代码为ASP.NET C#,采用asp.net和jquery异步方式实现。 用户登录采用模态弹出窗口,异步方式验证登录信息,不刷新页面。 用户注册,能检查用户名和密码是否为空,当用户输入用户名时可采用异步方式从数据库提取...

    如何ASP.NET Core Razor中处理Ajax请求

    在ASP.NET Core Razor(以下简称Razor)刚出来的时候,看了一下官方的文档,一直没怎么用过。 今天闲来无事,准备用Rozor做个项目熟练下,结果写第一个页面就卡住了。。折腾半天才搞好,下面给大家分享下解决方案。先来给...

    蓝牙串口聊天

    综合安卓蓝牙通信相关问题的详细操作。...定义handler时是要用static修饰,具体参考:http://blog.csdn.net/jdsjlzx/article/details/8463428 5.用于串口调试传输的字符时,需将String转换成char进行判定

    ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler

    ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler, 使用,具体的参数请参考程序中的介绍。

    Android:Handler的post()方法和Thread的start()方法执行Thread的run()方法的区别

    //h.post(r); /* * 在java中真正开启线程的方法是这样的。 */ Thread t = new Thread(r); t.start(); setContentView(R.layout.activity_main); System.out.println("Activity--&gt;"+ Thread....

    Asp.NET大文件上传开发总结集合

    以前开发过一个用Asp.NET上传大文件的代码,由于是在NET1.1下开发的,发现不能在NET.20下运行,前几天将这个问题解决了,现在把整个开发过程整理一下,供大家参考。由于内容较多,所以我打算分成六篇来写,第一篇写...

    asp.net ajax分页绑定数据

    asp.net ajax分页绑定数据 1.更改Handler文件下面GetDataSet方法中的数据库字段 表名 以及分页页数 2.更改default.aspx文件下 分页控制 3.添加分页存储过程 在压缩包里面都有

    ASP.NET中常用输出JS脚本的类实例

    本文实例讲述了ASP.NET中常用输出JS脚本的类,针对过去输出js脚本的类进行了一定的改进。在项目开发中非常具有实用价值。分享给大家供大家参考。具体如下: 很多时候在ASP.NET中我们经常需要输出一些JS脚本,比如弹...

    MVC_EF框架_Bootstrap示例

    上传模块:通用upload handler,及缩略图生成方式(按需生成,即时生成,延迟生成) 管道模块:通用HttpModule,用于注入通用功能到各个应用及网站 应用模块三层架构 提供OA,CMS,CRM系统的原型及DAL,IBLL及BLL实现...

    AsnyncTask与handler(二)——handler消息机制 ---源码

    博客《AsnyncTask与handler(二)——handler消息机制》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/24783459

    Android Studio实现学生信息管理系统,基础入门项目,详细注释,小白必看!

    使用了ListView、Sqlite、Handler、Intent和SharedPreferences等Android基础知识。 博客介绍地址:https://blog.csdn.net/qq_42257666/article/details/121912803 运行演示的视频地址:...

    使用 .NET 调用有自定义 Handler 验证的 XFire Web 服务

    NULL 博文链接:https://lzy.iteye.com/blog/292219

    asp.net(c#)用httphandler加水印

    asp.net(c#)用httphandler加水印

Global site tag (gtag.js) - Google Analytics