玩玩AJAX之使用ashx文件響應來自JQuery的JSON請求.


ashx文件是.net 2.0新加的文件類型(其實在.net 1.0下已經可用,但是沒有公開提供).

ashx文件和aspx文件有什么不同? 我們先新建一個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代碼:

 


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=\"#\" onclick=\"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文件如下:

 


<%@ 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"才算正確獲取到數據:

 


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

 

胡言亂語了這么久,都不知道自己要說什么了-_-|| 還是洗洗睡了.

 

忘了順便說一句:在ashx文件用使用Session必須實現 IRequiresSessionState 接口.

 

 

參見:

 

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

using  System;
using  System.Web;

using  System.Data;
using  System.Configuration;

using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;
using  _211;

using  System.Web.SessionState;
public   class  Handler : IHttpHandler, IRequiresSessionState
{

    
string  action  =   string .Empty;
    
string  id  =   string .Empty;
    
string  page  =   string .Empty;
    
string  pagehtml  =   string .Empty;
    
string  linkhtml  =   string .Empty;
    
int  Pages  =   5 ;

    
string  commentparentid  =   string .Empty;
    
string  commentuser  =   string .Empty;
    
string  commenttext  =   string .Empty;
    
string  commentvalidate  =   string .Empty;
  
    
public   void  ProcessRequest(HttpContext context) 
    {
        context.Response.ContentType 
=   " text/plain " ;
        
// context.Response.Write("Hello World");

       
        action 
=  context.Request.Params[ " action " ];
        id 
=  context.Request.Params[ " id " ];
        page 
=  context.Request.Params[ " page " ];

        commentparentid 
=  context.Request.Params[ " commentparentid " ];
        commentuser 
=  context.Request.Params[ " commentuser " ];
        commenttext 
=  context.Request.Params[ " commenttext " ];
        commentvalidate 
=  context.Request.Params[ " commentvalidate " ];

        
if  (action  ==   " ajax_getcomment " )
        {
            ajax_getcomment(id, Int32.Parse(page));
        }
        
else   if  (action  ==   " ajax_sendcomment " )
        {

            
// if (context.Session["VerifyCode"].ToString().ToLower() != commentvalidate.ToLower())
            
// {
            
//      // context.Request("ERROR!");
            
//     context.Response.Write("ERROR!");
            
// }
            
// else
            
// {
                DBQuery.ExecuteScalar( " insert into comment(commentparentid,commentuser,commenttext,commentreply,commentip) values(' "   +  commentparentid  +   " ',' "   +  commentuser  +   " ',' "   +  context.Server.HtmlEncode(commenttext)  +   " ','',' "   +  context.Request.ServerVariables[ " REMOTE_ADDR " +   " ') " );
            
//     context.Response.Write("評論發表成功!");
            
// }
        }
        
else
        {
            context.Response.Write(
" error! " );
        }

    }

    
private   void  ajax_getcomment( string  id,  int  page)
    {

        
using  (CommentBO cm  =   new  CommentBO(id, page  -   1 ))
        {
            
            HttpContext.Current.Response.Write(cm.getCommentContent());
        }
    }
    
    
public   bool  IsReusable {
        
get  
        {
            
return   false ;
        }
    }

}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com