AjaxPro 早期流行的 ASP.NET AJAX 庫,透過 `.ashx` 處理器實現客戶端直接呼叫伺服器端方法。部署至虛擬主機常因 ISAPI 對應缺失導致 404/500。本文提供完整設定檢查清單。
虛擬主機 IIS 預設可能未將 `.ashx` 延伸模組對應至 ASP.NET 執行引擎,導致 AjaxPro 處理器無法啟動。
<system.web>
<httpHandlers>
<!-- AjaxPro 1.x -->
<add verb="POST,GET" path="AjaxPro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro" />
<!-- 或 AjaxPro 2.x -->
<add verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro.2" />
</httpHandlers>
</system.web>
<!-- IIS 7+ 整合模式 -->
<system.webServer>
<handlers>
<add name="AjaxPro" verb="POST,GET" path="AjaxPro/*.ashx"
type="AjaxPro.AjaxHandlerFactory, AjaxPro" preCondition="integratedMode" />
</handlers>
</system.webServer>
protected void Page_Load(object sender, EventArgs e)
{
// 註冊當前頁面類別 (或任意類別) 的公用方法供客戶端呼叫
AjaxPro.Utility.RegisterTypeForAjax(typeof(YourPageClass));
}
[AjaxPro.AjaxMethod]
public DataSet GetUserList()
{
string sql = "SELECT UserID, UserName FROM Users";
return DataAccess.ExecuteDataSet(sql);
}
<script type="text/javascript">
function LoadUsers() {
// 命名空間:Namespace.ClassName.MethodName(callback)
YourNamespace.YourPageClass.GetUserList(OnGetUsersComplete);
}
function OnGetUsersComplete(response) {
var ds = response.value; // DataSet 物件 (AjaxPro 自動序列化)
var html = "";
for (var i = 0; i < ds.Tables[0].Rows.length; i++) {
html += ds.Tables[0].Rows[i].UserName + "<br/>";
}
document.getElementById("userList").innerHTML = html;
}
</script>
<button onclick="LoadUsers()">載入使用者</button>
<div id="userList"></div>
| 現象 | 可能原因 | 解決 |
|---|---|---|
| 404 Not Found | .ashx 未對應 ISAPI / 路徑大小寫不符 | 檢查 IIS 對應、Web.config path 大小寫 |
| 500 Internal Server Error | 型別載入失敗 / 組件版本不符 | 確認 Bin 目錄有 AjaxPro.dll、版本匹配 |
| response.value 為 undefined | 回傳型別不支援序列化 (如 DataReader) | 改回傳 DataSet、List、自訂 DTO |
| JavaScript 錯誤 "AjaxPro undefined" | 未引用自動生成的 .js 檔 | 頁面加入 `` |
AjaxPro 已停止維護多年,新專案強烈建議採用現代架構;維護舊專案時,上述 ISAPI 對應設定通常能解決 90% 的部署問題。