Share via


WCF Web 程式設計模型概觀

Web 程式撰寫模型 (Programming Model) 提供了使用 Windows Communication Foundation (WCF) 建置 (Build) Web 樣式服務所需的基本架構項目。Web 樣式服務主要提供最大範圍的用戶端 (包含不使用其他用戶端架構的網頁瀏覽器) 來存取使用,並具有下列唯一的需求:

  • URI 和 URI 處理。URI 在 Web 樣式服務的設計過程中,扮演很重要的角色。WCF Web 程式設計模型透過 UriTemplateUriTemplateTable 類別來提供 URI 處理能力。
  • 對 GET 和 POST 作業的支援。除了各種用來進行資料修改與遠端叫用的叫用動詞之外,Web 樣式服務還運用 GET 動詞來擷取資料。Web 程式設計模型使用 WebGetAttributeWebInvokeAttribute,將服務作業同時與 GET 和 POST 動詞進行關聯。
  • 多種資料格式。除了 SOAP 訊息以外,Web 樣式服務還可處理許多種類的資料。Web 程式設計模型使用 WebHttpBindingWebHttpBehavior 來支援許多不同的資料格式,包括 XML 文件、JSON 資料物件,以及諸如影像、視訊檔,或純文字之類的二進位內容資料流。

Web 程式設計模型可延伸 WCF 範圍來涵蓋 Web 樣式案例,包括 REST 服務、AJAX 和 JSON 服務,以及新聞訂閱 (ATOM/RSS) 摘要。如需 AJAX 和 JSON 服務的詳細資訊,請參閱 AJAX 整合與 JSON 支援。如需 新聞訂閱的詳細資訊,請參閱 WCF 新聞訂閱概觀

使用 UriTemplate 和 UriTemplateTable 來進行 URI 處理

URI 範本提供一個有效的語法,以便表示大量結構上類似的 URI 集合。例如,下列範本會表示以 "a" 開頭及以 "c" 結尾的所有三段式 URI 集合 (不論是否有中繼區段:a/{segment}/c)。

此範本會說明類似下列的 URI:

  • a/x/c
  • a/y/c
  • a/z/c
  • 等等。

在此範本中,大括號標記法 ("{segment}") 表示變數區段,而不是常值。

.NET Framework 3.5 提供全新的 API,可以使用 UriTemplate 這種 URI 範本。UriTemplates 可讓您執行下列作業:

  • 您可以使用一組參數來呼叫其中一種 Bind 方法,以產生與範本相符的「完全封閉式 URI」(Fully-Closed URI)。意思就是,URI 範本中的所有變數都會以實際值來取代。
  • 您可以使用候選 URI 來呼叫 Match(),以便透過範本將候選 URI 切割為自身的構成部分,並傳回包含不同的 URI (已依據範本中的變數加上標籤) 部分的字典。
  • Bind() 和 Match() 都是反向值,因此您可以呼叫 Match( Bind( x ) ) 並從一開始的相同環境重新開始。

在許多情況下 (特別是在伺服器上,需要根據 URI 將要求分派到服務作業時) 您都想要追蹤資料結構中可以獨立處理每一個包含的範本的 UriTemplate 物件集合。UriTemplateTable 代表 URI 範本集合,並且依據範本集合與候選 URI 來選取最佳對象。這與任何特定的網路堆疊都不相關 (包含 WCF),因此必要時您可以加以使用。

WCF 服務模型會透過 UriTemplateUriTemplateTable 將服務作業與 UriTemplate 所描述的 URI 集合關聯在一起。服務作業會透過 WebGetAttributeWebInvokeAttribute,與 UriTemplate 產生關聯。

服務作業參數與 URL

您可以輸入與服務作業關聯的 URL,透過網頁瀏覽器呼叫 Web 樣式服務。這些服務作業可能採取的參數,必須在 URL 中以字串格式指定。下表說明可以傳送至 URL 的型別和使用的格式。

型別 格式

Byte

0 - 255

SByte

-128 - 127

Int16

-32768 - 32767

Int32

-2,147,483,648 - 2,147,483,647

Int64

-9,223,372,036,854,775,808 - 9,223,372,036,854,775,807

UInt16

0 - 65535

UInt32

0 - 4,294,967,295

UInt64

0 - 18,446,744,073,709,551,615

Single

-3.402823e38 - 3.402823e38 (不需要指數標記法)

Double

-1.79769313486232e308 - 1.79769313486232e308 (不需要指數標記法)

Char

任何單一字元

Decimal

標準標記法中任何一個小數 (不含指數)

Boolean

True 或 False (不區分大小寫)

String

任何字串 (不支援 null 字串且不會進行逸出)

DateTime

MM/DD/YYYY

MM/DD/YYYY HH:MM:SS [AM|PM]

月/日/年

月/日/年 HH:MM:SS [AM|PM]

TimeSpan

DD.HH:MM:SS

其中 DD = 天數,HH = 小時,MM = 分鐘,SS = 秒數

Guid

GUID,例如:

936DA01F-9ABD-4d9d-80C7-02AF85C822A8

DateTimeOffset

MM/DD/YYYY HH:MM:SS MM:SS

其中 DD = 天數,HH = 小時,MM = 分鐘,SS = 秒數

Enums

列舉值,例如,如下列程式碼所示定義列舉。

public enum Days{ Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

任何個別的列舉值 (或其對應的整數值) 都可以在查詢字串中指定。

具有可以在型別和字串表示之間相互轉換之 TypeConverterAttribute 的型別。

取決於型別轉換子。

WebGet 和 WebInvoke

除了各種叫用動詞 (例如,HTTP POST、SOAP 服務所使用的動詞) 之外,Web 樣式服務還會使用擷取動詞 (例如,HTTP GET)。Web 程式設計模型可讓服務開發人員使用 WebGetAttributeWebInvokeAttribute,同時控制 URI 範本和與其服務作業相關聯的動詞。WebGetAttributeWebInvokeAttribute 可讓您控制個別作業如何繫結至 URI 及與這些 URI 相關聯的 HTTP 方法。例如,在下列程式碼中新增 WebGetAttributeWebInvokeAttribute

[ServiceContract]
interface ICustomer
{
  //"View It"
  [OperationContract]
  [WebGet]
  Customer GetCustomer():
  
  //"Do It"
  [OperationContract]
  [WebInvoke]
  Customer UpdateCustomerName( string id, 
                               string newName );
}

先前的程式碼可讓您進行下列 HTTP 要求。

GET /GetCustomer

POST /UpdateCustomerName

WebInvokeAttribute 會預設為 POST,但是您還是可以用它來控制其他動詞。

[ServiceContract]
interface ICustomer
{
  //"View It“ -> HTTP GET
  [OperationContract]
  [WebGet( UriTemplate=“customers/{id}” )]
  Customer GetCustomer( string id ):
  
  //"Do It“ -> HTTP PUT
  [OperationContract]
  [WebInvoke( UriTemplate=“customers/{id}”, Method=“PUT” )]
  Customer UpdateCustomer( string id, Customer newCustomer );
}

格式與 Web 程式設計模型

Web 程式設計模型的新功能可與許多不同的資料格式一起運作。在繫結層,WebHttpBinding 可以讀取並寫入下列不同種類的資料:

  • XML
  • JSON
  • 不透明的二進位資料流

意思就是,Web 程式設計模型可以處理任何資料型別,但您還是可以針對 Stream 進行程式設計。

.NET Framework 3.5支援 JSON 資料 (AJAX) 以及新聞訂閱摘要 (包括 ATOM 和 RSS)。如需 這些功能的詳細資訊,請參閱 WCF 新聞訂閱概觀以及 AJAX 整合與 JSON 支援

請參閱

概念

WCF Web 程式設計物件模型

其他資源

WCF 新聞訂閱
Web 程式設計模型