整頁重新整理、閃爍、頻寬浪費、使用者體驗差。WebService 行為 (`webservice.htc`) 讓瀏覽器**不離開頁面**呼叫伺服器 WebMethod,取得資料後局部更新 DOM。
[WebService(Namespace = "https://tempuri.org/")]
public class EmployeeService : System.Web.Services.WebService
{
[WebMethod]
public XmlDocument GetEmpDetailsByEmpID(int employeeID)
{
string connStr = ConfigurationManager.AppSettings["connectionString"];
using (var conn = new SqlConnection(connStr))
{
var ds = new DataSet("EmployeesRoot");
var cmd = new SqlCommand("SELECT * FROM Employees WHERE EmployeeID = @ID", conn);
cmd.Parameters.AddWithValue("@ID", employeeID);
var adapter = new SqlDataAdapter(cmd);
adapter.Fill(ds, "Employees");
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(ds.GetXml());
return xmlDoc;
}
}
}
<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<title>Employee Lookup</title>
<style>
.employee { border:1px solid #ccc; padding:10px; margin:10px; background:#f9f9f9; }
</style>
<script language="javascript" type="text/javascript">
// 1. 連結 HTC 行為
<!--
${emp.selectSingleNode("FirstName").text} ${emp.selectSingleNode("LastName").text}
職稱: ${emp.selectSingleNode("Title").text}
城市: ${emp.selectSingleNode("City").text}
電話: ${emp.selectSingleNode("HomePhone").text}
| 項目 | 說明 |
|---|---|
| webservice.htc | Microsoft 提供的 HTC 元件,需下載置於頁面同目錄。 |
| useService(wsdl, friendlyName) | 讀取 WSDL 建立 Proxy,`friendlyName` 為 JS 物件名稱。 |
| callService(callback, methodName, ...args) | 非同步呼叫,完成時觸發 `callback(result)`。 |
| result.value / result.error | 成功回傳值 (型別對應 WebMethod 回傳) / 錯誤物件。 |
| XML DOM 操作 | IE 專有 `selectSingleNode`、`text` 屬性解析 XML 回傳值。 |
IE WebService 行為是早期「無刷新局部更新」的先驅技術,透過 HTC 封裝 SOAP 通訊,提供非同步呼叫與結果回呼機制。雖已被現代 AJAX/WebAPI 取代,但其「客戶端非同步呼叫伺服器方法、局部更新 UI」的架構思想延續至今。理解此演進有助於掌握前後端分離架構的歷史脈絡。