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

WCF REST架構實戰(二):建立支援AJAX的WCF服務

     編輯:關於.NET

前言:重新認識 LO-REST 的價值

在上一篇〈WCF中的REST架構一(REST 概述)〉中,我們探討了 REST 架構的基本概念,並介紹了從 HI-REST(高度 RESTful)到 LO-REST(低度 RESTful)的連續光譜觀點。許多開發者直覺地將「好」等同於「高大全」,因而低估了 LO-REST 實作的價值。本文將透過實際建立一個支援 AJAX 的 WCF 服務,證明這類 LO-REST 服務同樣強大且實用。

解決方案背景與前置準備

本文使用的初始解決方案包含大部分底層邏輯,原為 12 集 AJAX 客戶端程式庫 Webcast 系列的一部分。提供此方案是為了讓我們專注於展示支援 AJAX 的 WCF 服務能力,避免從頭建立服務並整合前端的冗長步驟。方案中包含兩個關鍵的 ASP.NET AJAX 控制項:Catalog.js 與 ShoppingCart.js,其中 Catalog 控制項負責接收特定資料結構、顯示分頁產品資訊、處理資料綁定,以及在使用者選擇產品或點擊瀏覽控制項時觸發訊息。

Catalog 與 ShoppingCart 控制項示意圖

在宿主頁 Catalog.aspx 中,關鍵的 GetData() 方法會呼叫 WCF 服務,傳入 startIndex(起始索引)與 pageSize(頁面大小)等參數,並註冊成功與失敗的回呼函式。成功回呼中會取得 Catalog 控制項參考、設定目前頁面索引、以服務回傳的資料(有效負載)填入 productInfo 屬性,最後呼叫 dataBind() 執行 DOM 注入完成畫面更新。

Catalog.aspx GetData 方法程式碼

新增支援 AJAX 的 WCF 服務

在 Visual Studio 中新增支援 AJAX 的 WCF 服務非常簡單:在方案總管選擇「加入新項目」→ 選擇「AJAX-enabled WCF Service」→ 命名為 CatalogService.cs → 點擊「加入」。

新增 AJAX-enabled WCF Service 範本

範本產生的檔案解析

此範本實際上是在專案中新增特定檔案並修改設定檔,主要動作如下:

  1. 專案根目錄新增 CatalogService.svc
  2. App_Code 目錄新增 CatalogService.cs
  3. 修改 web.config 設定服務

1. CatalogService.svc - 服務的定位入口

<%@ ServiceHost Language="C#"
Debug="true"
Service="CatalogService"
CodeBehind="~/App_Code/CatalogService.cs" %>

.svc 檔案類比 .asmx,作為服務在 IIS/WAS 上的可定位資源(基底位址)。關鍵屬性:Service 指向實作服務的 CLR 型別名稱;CodeBehind 指向實作程式碼檔案。通常無需手動修改此檔案。

2. web.config - 核心組態設定

<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="CatalogServiceAspNetAjaxBehavior">
        <enableWebScript />
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  <services>
    <service name="CatalogService">
      <endpoint address=""
        behaviorConfiguration="CatalogServiceAspNetAjaxBehavior"
        binding="webHttpBinding"
        contract="CatalogService" />
    </service>
  </services>
</system.serviceModel>

組態重點在於三個子節點:

  • Services:定義名為 CatalogService 的服務,其端點包含 WCF 的 ABC(Address、Binding、Contract)。位址為空白,因由 .svc 檔案提供基底位址;綁定使用 webHttpBinding(WCF 3.5 新增,支援 REST 風格);合約設為 CatalogService,採用「介面推斷」方式,直接以類別標註 [ServiceContract] 而非介面。
  • Behaviors:定義端點行為 CatalogServiceAspNetAjaxBehavior,包含 <enableWebScript /> 元素。這是 webHttp 行為的子集,專門提供 AJAX 功能(如產生客戶端 Proxy)。
  • ServiceHostingEnvironment:將 aspNetCompatibilityEnabled 設為 true,讓 WCF 要求納入 ASP.NET 要求管線,得以使用 Session、Context 等 ASP.NET 功能。

關鍵結論:要讓 WCF 支援 REST,組態只需兩點——binding="webHttpBinding" 以及端點行為設為 webHttp 或 enableWebScript。

3. CatalogService.cs - 服務實作邏輯

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode =
AspNetCompatibilityRequirementsMode.Allowed)]
public class CatalogService
{
    // Add [WebGet] attribute to use HTTP GET
    [OperationContract]
    public void DoWork()
    {
        // Add your operation implementation here
        return;
    }
    // Add more operations here and mark them with [OperationContract]
}

此處採用介面推斷,以類別標註 [ServiceContract]。首先要設定 Namespace 參數(如 urn:shopping/services),這決定了客戶端 Proxy 的命名空間。

實作業務操作:取得分頁產品資料

新增 GetProductGrouping 操作,使用 LINQ to SQL 從資料庫取得指定頁面的產品資訊。回傳型別為 ProductGroupingData,包含產品清單(ProductData)與分頁所需的中繼資料(StartIndex、PageSize、TotalCount)。

[DataContract]
public class ProductData
{
    [DataMember] public int ProductId;
    [DataMember] public string ProductName;
    [DataMember] public string Description;
    [DataMember] public decimal Price;
    [DataMember] public string ProductImage;
}

[DataContract]
public class ProductGroupingData
{
    [DataMember] public List<ProductData> Products;
    [DataMember] public int StartIndex;
    [DataMember] public int PageSize;
    [DataMember] public int TotalCount = 0;
}
[OperationContract]
public ProductGroupingData GetProductGrouping(int startIndex, int pageSize)
{
    using (CatalogDataContext catalogCtx = new CatalogDataContext())
    {
        var products = from p in catalogCtx.Products
                       orderby p.ProductName
                       select new ProductData()
                       {
                           ProductId = p.ProductId,
                           ProductName = p.ProductName,
                           Description = p.ProductDescription,
                           Price = p.Price,
                           ProductImage = p.ProductImage
                       };

        var productColl = products.Skip(startIndex).Take(pageSize).ToList();

        var package = new ProductGroupingData()
        {
            Products = productColl,
            StartIndex = startIndex,
            PageSize = pageSize,
            TotalCount = catalogCtx.Products.Count()
        };
        return package;
    }
}

至此,我們已完成一個支援 AJAX 的 WCF 服務建立。下一篇將探討如何在客戶端呼叫此服務。

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