現在大多數使用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 中,符合三層架構.