ASP.NET AJAX 庫 **AjaxPro** (舊專案常見) 需透過 `.ashx` 處理器端點通訊。IIS 預設可能未對應 `.ashx`,導致呼叫失敗 (404/500)。
對應的可執行檔路徑 (IIS 6 / 傳統模式):
`C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll` (32-bit)
`C:\Windows\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll` (64-bit)
<configuration>
<system.web> <!-- IIS 6 / Classic 模式 -->
<httpHandlers>
<add verb="POST,GET" path="AjaxPro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro" />
<!-- 或視版本 -->
<add verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro.2" />
</httpHandlers>
</system.web>
<system.webServer> <!-- IIS 7+ / Integrated 模式 -->
<handlers>
<remove name="AjaxPro" />
<add name="AjaxPro" verb="POST,GET" path="AjaxPro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro" preCondition="integratedMode" />
</handlers>
</system.webServer>
</configuration>
**關鍵點:** `path="AjaxPro/*.ashx"` 必須與前端呼叫 URL 前綴一致 (預設 `AjaxPro/`)。
// Page_Load 或建構函式 AjaxPro.Utility.RegisterTypeForAjax(typeof(YourPageClass)); // 或針對特定方法類別 AjaxPro.Utility.RegisterTypeForAjax(typeof(YourServiceClass));
<script src="AjaxPro/prototype.ashx"></script> <!-- AjaxPro 自動產生的 Proxy -->
<script>
// 呼叫伺服器端靜態方法
YourNamespace.YourClass.YourMethod(parameters, callbackFunction);
function callbackFunction(response) {
if (response.error) {
alert("錯誤: " + response.error.message);
} else {
var result = response.value; // 回傳值 (DataSet, String, Object...)
// 處理結果
}
}
</script>
[AjaxPro.AjaxNamespace("WebServer")] // 可選,指定 JS 命名空間
public partial class Index : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// 註冊當前頁面類別 (包含 AjaxMethod 的方法)
AjaxPro.Utility.RegisterTypeForAjax(typeof(Index));
}
[AjaxPro.AjaxMethod(HttpSessionStateRequirement.Read)] // 需 Session 時
public DataSet Change()
{
string sql = "SELECT xjh, xm FROM xs_jbxx";
// 假設 cla.Bind 回傳 DataSet
DataSet ds = cla.Bind(sql);
return ds;
}
}
WebServer.Index.Change(change_callback); // 命名空間.類別.方法
function change_callback(response) {
if (response.error) { alert(response.error.message); return; }
var ds = response.value; // DataSet 物件 (AjaxPro 客戶端序列化格式)
var content = document.getElementById("newDG");
var html = "";
for (var i = 0; i < ds.Tables[0].Rows.length; i++) {
html += ds.Tables[0].Rows[i].xm + "<br/>";
}
content.innerHTML = html;
}
| 現象 | 原因 | 解決 |
|---|---|---|
| 404 Not Found (.ashx) | IIS 未對應 *.ashx / "檔案存在" 勾選 | 步驟 1:新增處理器對映、取消勾選檔案存在 |
| 500 Internal Server Error | Web.config httpHandlers/handlers 缺失/型別錯誤 | 步驟 2:確認型別 `AjaxPro.AjaxHandlerFactory, AjaxPro` 正確、組件在 Bin 目錄 |
| response.error: "Type not registered" | 未呼叫 RegisterTypeForAjax | 步驟 3:Page_Load 註冊類別 |
| Session 為 null | AjaxMethod 未標示 Session 需求 | 加 `[AjaxPro.AjaxMethod(HttpSessionStateRequirement.Read)]` |
| 跨域呼叫失敗 | 瀏覽器同源策略 | 同域部署、或配置 CORS (AjaxPro 舊版不支援,需代理) |
AjaxPro 在 IIS 上運行需三大鐵律:**IIS 對應 *.ashx (取消檔案存在檢查) + Web.config 註冊 HttpHandler + 伺服器端 RegisterTypeForAjax**。逐項核對,舊專案即可平滑運行。新專案建議遷移至 **ASP.NET Web API / ASP.NET Core + fetch/axios**,架構更現代、維護性更佳。
Apache 啟用 .htaccess 支援:httpd.conf 核心配置一步到位
IIS 架設 PHP + MySQL + Zend 圖文教學 (Windows 2000 環境)
Windows 2000 Server 網路配置實戰(上):硬體需求、伺服器磁碟規劃與安裝準備
伺服器記憶體術語解析:RDIMM vs UDIMM 差異、原理與選購指南 (Intel 5500 系列 Xeon 為例)
解決「定義了重複的 system.web.extensions/scripting/scriptResourceHandler」錯誤