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

http://www.cnblogs.com/KenBlove/archive/2008/11/27/1342394.html

 

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

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

 



ashx

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

using System;
using System.Web;

public class Handler : IHttpHandler {

public void ProcessRequest (HttpContext context) {
context.Response.ContentType
= " text/plain " ;
context.Response.Write(
" Hello World " );
}

public bool IsReusable {
get {
return false ;
}
}

}

 

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

看看.net config文件中对两个文件类型请求的配置吧

 



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.响应速度也应该快点吧:)

只要具体继承了IHttpHandler如何处理的问题,我这里找到一篇早期的,介绍.net 2.0编译模型的问题.比较深奥,要慢慢鼓捣一下:

点击下载文章

鼓捣完了你就大概明白了ashx不过.net里面自定义好的一个请求格式,ashx文件类的文件的处理过程要比aspx要简单得多.

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

看看JS代码:

 



JS

function getSecondaryContent(menuId){
$.getJSON(
" Article/FreshNews.ashx " , function (data) {
var txt = " <ul class=/ " news/ " > " ;
$.each(data,
function (i,n){
if (n.Url == " # " )
txt
+= " <li><a href=/ " #/ " οnclick=/ " articleTitle_onclick( ' "+ n.ArticleId +" ' )/ " > " + n.Title + " </a></li> " ;
else
txt
+= " <li><a href=/ "" + n.Url + " / " target=/ " _blank/ " > " + n.Title + " </a></li> " ;
});
txt
+= " </ul> " ;
$(
" # " + menuId).after(txt);
});
}

 

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

ashx文件如下:

 



ashx

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

 

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

 



APP_Code

using System;
using System.Web;

public class FreshNews : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
// context.Response.ContentType = "text/plain";
context.Response.ContentType = " application/json " ;
context.Response.Charset
= " utf-8 " ;
string txt = " [{/ " Title/ " :/ " 学习使用AJAX技术/ " ,/ " Url/ " :/ " #/ " ,/ " ArticleId/ " :/ " Art1234/ " },{/ " Title/ " :/ " 使用JQuery构建网站/ " ,/ " Url/ " :/ " #/ " ,/ " ArticleId/ " :/ " Art1235/ " },{/ " Title/ " :/ " 使用JSON文件传输数据/ " ,/ " Url/ " :/ " #/ " ,/ " ArticleId/ " :/ " Art1236/ " }] " ;
context.Response.Write(txt);
}

public bool IsReusable
{
get
{
return false ;
}
}

}

 

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

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

 



webconfig

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

 

就是因为JSON文件只支持Unicode编码,所以我就一狠心将所有编码都改成utf-8,想着这样做就一定没有错了.谁知道,js接收的数据中 文死活是乱码,无论我怎么设置ContentType都是一样,差点没有把我气疯.

后来千辛万苦才想起好像这些编码和当前区域设置有关,续步尝试之下,发现只有将fileEncoding设置为"gb2312"才算正确获取到数 据:

 



right config

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

 

胡言乱语了这么久,都不知道自己要说什么了-_-|| 还是洗洗睡了.

 

忘了顺便说一句:在ashx文件用使用Session必须实现 IRequiresSessionState 接口.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值