ExtJS 中使用Asp.net編寫後臺服務器程序的幾種方式

現在大多數使用Extjs的程序都使用Java來編寫後臺服務器程序,下面簡單介紹一下如何使用Asp.net來編寫後臺服務器程序.

使用Asp.net編寫Extjs的後臺服務器程序大概有下面幾種方式:

1.使用 .net Framework 3.5中的WCF來實現,因爲.net 3.5 中的WCF 中新增加了一個Attributes來支持這種方式,但是具體沒有使用過,有興趣的朋友可以關注一下.

2.在Asp.net中定義一個.aspx頁面,然後在aspx.cs中文件中添加一個方法來相應Extjs的web 請求,具體方式如下:

     2.1:

public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ExtJsRequest();
            }
        }

        public string ExtJsRequest()
        {
            
            string sRtn = string.Empty;
            string sReq = Request["req"].ToString();

            sRtn = "{'success':true,'Message':" + sReq + "}";
            
            return sRtn;            
        }
    }

     這種方法使用起來比較簡單,但是會在Server 端生成很多不需要的aspx頁面,基本上每定義一個方法就需要在服務端定義一個頁面,不利於代碼的維護.

 3:借鑑Java 中的Servlet原理,將Extjs的請求分流到Server端具體的類中去,避免了不需要的aspx頁面的生成,具體的實現如下:

     3.1:在Server端實現一個繼承IHttpHandler接口的類,在其中實現對Extjs請求的分流.

     public class Servlet : System.Web.IHttpHandler
    {
        public DataSet ds;
        public Servlet()
        {
            ds = new DataSet();
            string path = HttpContext.Current.Server.MapPath("../Config.xml");           
            ds.ReadXml(path);
        }

        public void ProcessRequest(HttpContext ctx)
        {
            try
            {                
                string name = ctx.Request.Url.AbsolutePath;
                name = name.Substring(0, name.IndexOf('.'));

                DataRow[] dc = ds.Tables[0].Select("url ='" + name + "'");
                if (dc.Length > 0)
                {
                    Type ht = Type.GetType(dc[0]["Class"].ToString());
                    object obj = Activator.CreateInstance(ht);
                    MethodInfo mi = ht.GetMethod(dc[0]["function"].ToString());
                    object objRtn = mi.Invoke(obj, new object[] { ctx.Request });
                    ctx.Response.Write(objRtn as string);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public bool IsReusable
        {
            get
            {
                return true;
            }
        }
    }

     代碼中標記爲黃色的部分是一個自定義的配置文件格式.

     3.2 :自定義配置文件

     <?xml version="1.0" encoding="utf-8" ?>
     <ConfigNode>

          <Mapping url="/YouProject/User/List" Class="WebUI.Bll.User" Function="List"></Mapping>

     </ConfigNode>
     配置文件中相關屬性介紹:

     URL:請求ExtJs的請求地址;

     Class:該請求分流到的Server端具體的類;

     Function:Server具體類中的對應Extjs請求的方法;

     標記爲紅色的代碼是使用反射來定位到Server端具體類的具體方法;

     3.3:定義相關實體類

     WebUI.Bll.User 定義如下:

     namespace WebUI.Bll
     {
         public class User
         {

             public string List(HttpRequest request)
             {

                    ...具體邏輯
             }

          }

     }

     需要注意的是:

     1.WebUI.Bll.User 的方法必須定義爲public;

     2.List 方法必須帶一個HttpRequest的參數,因爲要獲取相應的Extjs的請求參數;

     3.4:在WebConfig 進行配置

     <httpHandlers>
             <remove verb="*" path="*.asmx"/>
             <add verb="*" path="/YouProject/login.aspx" type="System.Web.UI.PageHandlerFactory"/> ---不攔截
             <add verb="*" path="*.aspx" type="Servlet"/>   ---使用自定義的Httphander 來進行處理
             <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
             <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
             <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
       </httpHandlers>

      因爲Asp.net會對.aspx頁面使用默認的HttpHandler來進行攔截:System.Web.UI.PageHandlerFactory,所以如果在你的程序中你有的頁面不想攔截比如:login.aspx,logout.aspx,Index.aspx ,那你可以在<httpHandler>配置節中進行配置。

     通過第3種方法,在Server 端可以很好的組織代碼,並且無需增加不必要的.aspx頁面,可以將實體類定義到 Bussiness Layer 中,符合三層架構.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章