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

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

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

代码
 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代码:

 

代码
 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=\"#\" onclick=\"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里面了.

 

代码
 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" />

posted @ 2010-01-10 22:07    阅读(391)  评论(0编辑  收藏  举报