WCF (Windows Communication Foundation) 原本以 SOAP 為核心,自 .NET 3.5 起引入 WebHttpBinding 與 WebGet/WebInvoke 屬性,完整支援 REST 風格服務。本文記錄從服務契約定義、宿主選擇、JSON 序列化到圖片串流傳輸的完整實作筆記。
[ServiceContract]
public interface IRESTService
{
// 回傳 JSON 物件:UriTemplate 使用 {參數} 對應方法參數
[OperationContract]
[WebGet(UriTemplate = "{name}?token={token}", ResponseFormat = WebMessageFormat.Json)]
Person GetPerson(string name, string token);
// 回傳圖片串流:ContentType 需手動設定
[OperationContract]
[WebGet(UriTemplate = "Data/{id}?token={token}")]
Stream GetData(string id, string token);
}
關鍵點:
WebGet 固定 HTTP GET;WebInvoke 支援 POST/PUT/DELETE 等,彈性更高。UriTemplate 路徑參數({name})與查詢字串參數(?token={token})皆可對應。string,WCF 會自動轉型。ResponseFormat = WebMessageFormat.Json 指定輸出 JSON(預設 XML)。[DataContract]
public class Person
{
[DataMember] public string Name { get; set; }
[DataMember] public DateTime Birthday { get; set; }
// DateTime 序列化為 "/Date(1241764517437+0800)/" 格式,前端需自行解析
}
| 模式 | 代碼複雜度 | 彈性 | 適用場景 |
|---|---|---|---|
| WebServiceHost | 極低(一行) | 預設 WebHttpBehavior、help page | 快速原型、純 REST 服務 |
| ServiceHost + 手動配置 | 較高 | 完整控制 Binding、Behavior、Endpoint | 混合 SOAP/REST、自訂攔截器、複雜安全需求 |
var host = new WebServiceHost(typeof(RESTService), new Uri("https://localhost:8000/RestService"));
host.Open();
var host = new ServiceHost(typeof(RESTService), baseAddress);
var binding = new WebHttpBinding();
var endpoint = host.AddServiceEndpoint(typeof(IRESTService), binding, baseAddress);
endpoint.Behaviors.Add(new WebHttpBehavior()); // 關鍵:啟用 REST 處理管線
host.Open();
public Person GetPerson(string name, string token)
{
return new Person { Name = name, Birthday = DateTime.Now };
}
// 請求:GET https://localhost:8000/RestService/Tom?token=123
// 回應:{"Birthday":"\/Date(1241764517437+0800)\/","Name":"Tom"}
建議安裝瀏覽器擴充套件(如 JSONView)美化檢視。
public Stream GetData(string id, string token)
{
// 必須設定 ContentType,否則瀏覽器無法正確渲染
WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
var ms = new MemoryStream();
try
{
using (var bmp = new Bitmap(@"E:\1.jpg"))
{
bmp.Save(ms, bmp.RawFormat);
}
ms.Position = 0; // 重置指標至開頭,否則用戶端讀取到空串流
return ms;
}
catch (Exception ex)
{
Console.WriteLine(ex);
return null;
}
}
關鍵陷阱與解決方案:
Stream,無需手動 Dispose。byte[],WCF 預設以 XML 序列化並 Base64 編碼,非純二進位。必須使用 Stream + 設定 ContentType。MaxReceivedMessageSize、ReaderQuotas.MaxStringContentLength、SendTimeout/ReceiveTimeout。建議 10MB 以內使用 WCF,超大檔案改用 IIS 靜態檔案服務或 Blob Storage + SAS URL。https://localhost:8000/RestService/Tom?token=123https://localhost:8000/RestService/Data/100?token=200 瀏覽器直接顯示圖片。範例中的 token 參數預留簡易驗證擴充點。生產環境建議:
WebHttpBinding + TransportCredentialOnly 或 Transport (HTTPS) 保障傳輸安全。IDispatchMessageInspector 或 ServiceAuthorizationManager 統一驗證 Token/JWT。WebHttpBehavior 的 HelpEnabled 提供自動化說明頁面。WCF REST 雖非最新技術棧(ASP.NET Core Web API 為主流),但在維護 .NET Framework 4.x 專案、整合舊有 WCF 服務、需同時支援 SOAP/REST 雙協定時,仍具不可替代價值。掌握其核心配置與串流處理細節,能讓遷移與維護工作事半功倍。