玩玩AJAX之使用ashx文件响应来自JQuery的JSON请求

ashx文件是.net 2.0新加的文件类型(其实在.net 1.0下已经可用,但是没有公开提供).

ashx文件和aspx文件有什么不同? 我们先新建一个ashx文件看看:

ExpandedBlockStart.gif 代码
 1  <% @ WebHandler Language = " C# "  Class = " Handler "   %>
 2 
 3  using  System;
 4  using  System.Web;
 5 
 6  public   class  Handler : IHttpHandler {  
 7       public   void  ProcessRequest (HttpContext context) {
 8          context.Response.ContentType  =   " text/plain " ;
 9          context.Response.Write( " Hello World " );
10      }
11   
12       public   bool  IsReusable {
13           get  {
14               return   false ;
15          }
16      }
17  }
18 


,aspx简洁多了吧.只有一个文件,没有后台cs文件(基于代码安全考虑,后边我们会自己添加这个文件).ashx对比aspx文件,就好像少了cs文件.其实这就是ashxaspx不同的地方,因为aspx要将前后台显示和处理逻辑分开,所以就弄成了两个文件,其实,在最终编译的时候,aspxcs还是会编译到同一个类中去.这中间就要设计html的一些逻辑处理.ashx不同,它只是简单的对web http请求的直接返回你想要返回的结果.aspx少处理了html的过程.理论上,aspx要快.

看看.net config文件中对两个文件类型请求的配置吧.
< add path = " *.aspx "  verb = " * "  type = " System.Web.UI.PageHandlerFactory "  validate = " True "   />
< add path = " *.ashx "  verb = " * "  type = " System.Web.UI.SimpleHandlerFactory "  validate = " True "   />

可以看到两个文件处理的类不一样(ashx处理的类叫SimpleHandleFactory,既然叫Simple,应该处理过程也比较Simple.响应速度也应该快点吧:)

 

不说这些东西了.说会怎么利用ashx文件来实现我们的AJAX请求吧(其实实现和JQuery和JSON关系不大)

看看JS代码:

 

ExpandedBlockStart.gif 代码
 1  function  getSecondaryContent(menuId){
 2      $.getJSON( " Article/FreshNews.ashx " function (data) {
 3           var  txt  =   " <ul class=\ " news\ " > " ;
 4          $.each(data, function (i,n){
 5               if (n.Url  ==   " # " )
 6                  txt  +=   " <li><a href=\ " #\ "  οnclick=\ " articleTitle_onclick( ' "+ n.ArticleId +" ' )\ " > " +  n.Title  + " </a></li> " ;
 7               else
 8                  txt  +=   " <li><a href=\ "" + n.Url + " \ "  target=\ " _blank\ " > " +  n.Title  + " </a></li> " ;
 9          });
10          txt  +=   " </ul> " ;
11          $( " # " + menuId).after(txt);
12      });
13  }
14 

 

 

和用其他文件没有差别吧?天下乌鸦一般黑!(~~~忽然冒出这个比喻.自己都觉得汗-_-||)

ashx文件如下:

<% @ WebHandler Language = " C# "  Class = " FreshNews "   %>

 

 

怎么样?是不是发觉少了点东西?和新建的文件不同了吧?呵呵,其实是我们将上边这句话以外的所有代码都放到App_Code里面了.

 

ExpandedBlockStart.gif 代码
 1  using  System;
 2  using  System.Web;
 3 
 4  public   class  FreshNews : IHttpHandler
 5  {
 6       public   void  ProcessRequest(HttpContext context)
 7      {
 8           // context.Response.ContentType = "text/plain";
 9          context.Response.ContentType  =   " application/json " ;
10          context.Response.Charset  =   " utf-8 " ;
11           string  txt  =   " [{\ " Title\ " :\ " 学习使用AJAX技术\ " ,\ " Url\ " :\ " #\ " ,\ " ArticleId\ " :\ " Art1234\ " },{\ " Title\ " :\ " 使用JQuery构建网站\ " ,\ " Url\ " :\ " #\ " ,\ " ArticleId\ " :\ " Art1235\ " },{\ " Title\ " :\ " 使用JSON文件传输数据\ " ,\ " Url\ " :\ " #\ " ,\ " ArticleId\ " :\ " Art1236\ " }] " ;
12          context.Response.Write(txt);
13      }
14 
15       public   bool  IsReusable
16      {
17           get
18          {
19               return   false ;
20          }
21      }
22 
23  }
24 

 

 

为什么要这样?因为MS说系统发布的时候ashxasmx类型文件都是"生成程序集。原始文件保留在原位置,作为完成请求的占位符。",为了发布后不让人随便看到我们的代码,我们只有把代码移到App_Code里面了.不过,.net的反编译比什么都容易-_-|| 聊胜于无,心理安慰吧!

还有一个小插曲:因为我在web.config里面的设置是:

<globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8" responseHeaderEncoding="utf-8" />

就是因为JSON文件只支持Unicode编码,所以我就一狠心将所有编码都改成utf-8,想着这样做就一定没有错了.谁知道,js接收的数据中文死活是乱码,无论我怎么设置ContentType都是一样.后来发现只有将fileEncoding设置为"gb2312"才算正确获取到数据:

<globalization fileEncoding="gb2312" requestEncoding="utf-8" responseEncoding="utf-8" responseHeaderEncoding="utf-8" />

转载于:https://www.cnblogs.com/stray521/archive/2010/01/10/1643701.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值