摘要:此做法乃 ASP.NET AJAX 內建的 Page Method 的開發方式
之前看到 wewa 向 Y! 提出網頁透過 jQuery AJAX 進行欄位驗證的架構,
透過撰寫 .ashx 的方式開發供 jQuery AJAX 呼叫的 JSON Web Service,
如此做法有兩個問題:
1. 以 .ashx 開發 JSON Web Service 不易, 例如: 缺乏對 Web Service 參數的支援, 開發的人必須自行處理 JSON 序列化
2. 若未來以此機制開發呼叫 BLL 的物件的 JSON Web Service, 則可能造成 .ashx 與 .aspx 數量倍增的問題
在此提供一個建議做法, 此做法乃 ASP.NET AJAX 內建的 Page Method 的開發方式,
ASP.NET AJAX 內建允許 client 端的 Javascript (ASP.NET AJAX 或 jQuery 皆可) 對該 .aspx 頁面內含的 Code Behind 方法進行呼叫的功能,
此功能稱之為 ASP.NET Page Method, 透過對 Code Behind 類別中特定的 static method 上加註 [WebMethod] 的屬性,
將該 static method 宣告成可供 client 端 Javascript 呼叫的 JSON Web Service,
如此做法的好處是, 當未來開發業務功能的網頁時, 希望透過 AJAX 進行 BLL 的呼叫時, 可將相關的程式邏輯集中於該 .aspx 中開發,
以避免 .aspx / .ashx 隨業務功能的網頁量增加時, 兩者的數量隨之增加, 造成程式維護上的困難.
但此做法的最大問題是無法與 .aspx 的 Code Behind Page 類別的 Page 初始化機制相容,
因宣告為 [WebMethod] 的方法必須為 static 的, 故放置於 Base Page 中或 Page_Init 中的安全性驗證的程式碼,
或該頁面的 Object Factory 初始化的作業等皆無法被宣告為 [WebMethod] 的 static method 使用到,
欲於 static method 中進行安全性驗證或初始化 Object Factory 則必須另外通過 helper class 來完成.
範例程式:
http://encosia.com/using-jquery-to-directly-call-aspnet-ajax-page-methods/ (通過 jQuery AJAX 呼叫 ASP.NET Page Method, 無參數)
http://encosia.com/easily-build-powerful-client-side-ajax-paging-using-jquery/ (通過 jQuery AJAX 呼叫 ASP.NET Page Method, 有參數)
//----------
QA
1. JSON序列化將會由 ASP.NET <http://asp.net/> 完成, 所以, 開發人員不用去傷腦筋這裡頭的技術協定?
>> 是的, ASP.NET 會處理 JSON Serialization 的問題.
2. Web Service 寫在 aspx 裡面時, 因為是 static , 所以不能使用 BasePage的相關安全性驗證的程式碼, 如: 我們有把 AntiXss 寫在 BasePage裡面, 因此也無法使用, 必須用 Helper class 來驗證是否有 Xss 攻擊? Object 的建立, 也必須自行寫工廠方法來建立, 而無法使用網頁的 factory 功能。
>> 是的, 你的理解是正確的. 亦可將 AntiXSS & Object Factory 的功能加到 base page 的 static method 供 ASP.NET Page Method 呼叫.
3. 若有一個 Web Service 是共用的, 並非只有單一網頁會使用, 可能有很多網頁都會讀同一個 Service 時, 我們要如何設計才好?
>> 如果是此類供 jQuery AJAX 共用呼叫的 ASP.NET Page Method, 建議根據業務劃分創建一 .aspx 頁面 (沒有畫面的 .aspx) 放置這些業務功能相關聯的 ASP.NET Page Method, 概念類似設計 BLL 一樣.