首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

打造輕量級 WCF RESTful 服務:從契約設計到二進位資料傳輸實戰

     編輯:關於.NET

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、自訂攔截器、複雜安全需求

WebServiceHost 一鍵啟動

var host = new WebServiceHost(typeof(RESTService), new Uri("https://localhost:8000/RestService"));
host.Open();

ServiceHost 手動配置(等同 WebServiceHost 內部行為)


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();

服務實作細節

1. 回傳 JSON 物件


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)美化檢視。

2. 回傳圖片串流(二進位資料)


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;
    }
}

關鍵陷阱與解決方案:

  • 串流釋放問題:WCF 會在傳輸完成後自動關閉/釋放回傳的 Stream,無需手動 Dispose。
  • byte[] 回傳 Base64 問題:若回傳型別為 byte[],WCF 預設以 XML 序列化並 Base64 編碼,非純二進位。必須使用 Stream + 設定 ContentType。
  • 大檔案傳輸:調整 Binding 配額:MaxReceivedMessageSize、ReaderQuotas.MaxStringContentLength、SendTimeout/ReceiveTimeout。建議 10MB 以內使用 WCF,超大檔案改用 IIS 靜態檔案服務或 Blob Storage + SAS URL。

測試驗證

  • JSON 服務:https://localhost:8000/RestService/Tom?token=123
  • 圖片服務:https://localhost:8000/RestService/Data/100?token=200 瀏覽器直接顯示圖片。

延伸議題:認證與安全

範例中的 token 參數預留簡易驗證擴充點。生產環境建議:

  1. 採用 WebHttpBinding + TransportCredentialOnly 或 Transport (HTTPS) 保障傳輸安全。
  2. 實作 IDispatchMessageInspector 或 ServiceAuthorizationManager 統一驗證 Token/JWT。
  3. 啟用 WebHttpBehavior 的 HelpEnabled 提供自動化說明頁面。

WCF REST 雖非最新技術棧(ASP.NET Core Web API 為主流),但在維護 .NET Framework 4.x 專案、整合舊有 WCF 服務、需同時支援 SOAP/REST 雙協定時,仍具不可替代價值。掌握其核心配置與串流處理細節,能讓遷移與維護工作事半功倍。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved