Web Service (ASMX/WCF) 仍是企業級系統集成主力。本文總結實體類設計禁忌、序列化陷阱、以及 Silverlight 客戶端協同的分層架構實踐。

Jasen.SilverlightService:Silverlight 客戶端專案Jasen.SilverlightService.Core:共享契約/實體/演算法庫(職責鏈模式實現路徑演算法)Jasen.SilverlightService.Web:Web Service 發布站點| 規則 | 錯誤示範 | 正確示範 | 原因 |
|---|---|---|---|
| 不可使用介面作為返回類型 | IList<T> | List<T> 或 T[] | 序列化器需具體型別實例化 |
| 型別必須可序列化 | 未標記 [Serializable] 或 [DataContract] | 標記 [DataContract]、成員 [DataMember] | WCF DataContractSerializer 強制要求 |
| 必須有無參構造函式 | public Entity(int id) { ... } | public Entity() { } + public Entity(int id) : this() { } | 反序列化時先 new() 再設屬性 |
| 唯讀屬性不序列化 | public string Name { get; } | public string Name { get; set; } | 無 setter 無法反序列化賦值 |
[DataContract]
public class ServerInfo {
[DataMember] public string Title { get; set; }
[DataMember] public string Content { get; set; }
[DataMember] public bool IsPublished { get; set; }
// 唯讀欄位:僅序列化輸出,不接受客戶端輸入
[DataMember] public string SmallTitle { get; } = "small title";
[DataMember] public bool IsSucceed { get; } = true;
}
[ServiceContract]
public interface IDataService {
[OperationContract]
ServerInfo GetData(string param); // 參數、返回皆為具體型別
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DataService : IDataService {
public ServerInfo GetData(string param) {
// 調用 Core 庫職責鏈演算法
var result = AlgorithmChain.Execute(param);
return new ServerInfo { Title = result.Title, Content = result.Detail };
}
}
var client = new DataServiceClient();
client.GetDataCompleted += (s, e) => {
if (e.Error == null) {
var info = e.Result;
// 繫結 UI:info.Title, info.Content
}
};
client.GetDataAsync("paramValue");
[DataContract(IsReference=true)] 或 DTO 扁平化。<binding messageEncoding="Mtom">,分塊傳輸。IErrorHandler 返回友善 FaultException。clientaccesspolicy.xml 或 crossdomain.xml 部署於網站根目錄。