WCF Web 程式設計模型概觀
Web 程式撰寫模型 (Programming Model) 提供了使用 Windows Communication Foundation (WCF) 建置 (Build) Web 樣式服務所需的基本架構項目。Web 樣式服務主要提供最大範圍的用戶端 (包含不使用其他用戶端架構的網頁瀏覽器) 來存取使用,並具有下列唯一的需求:
- URI 和 URI 處理。URI 在 Web 樣式服務的設計過程中,扮演很重要的角色。WCF Web 程式設計模型透過 UriTemplate 和 UriTemplateTable 類別來提供 URI 處理能力。
- 對 GET 和 POST 作業的支援。除了各種用來進行資料修改與遠端叫用的叫用動詞之外,Web 樣式服務還運用 GET 動詞來擷取資料。Web 程式設計模型使用 WebGetAttribute 和 WebInvokeAttribute,將服務作業同時與 GET 和 POST 動詞進行關聯。
- 多種資料格式。除了 SOAP 訊息以外,Web 樣式服務還可處理許多種類的資料。Web 程式設計模型使用 WebHttpBinding 和 WebHttpBehavior 來支援許多不同的資料格式,包括 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 服務模型會透過 UriTemplate 和 UriTemplateTable 將服務作業與 UriTemplate 所描述的 URI 集合關聯在一起。服務作業會透過 WebGetAttribute 或 WebInvokeAttribute,與 UriTemplate 產生關聯。
服務作業參數與 URL
您可以輸入與服務作業關聯的 URL,透過網頁瀏覽器呼叫 Web 樣式服務。這些服務作業可能採取的參數,必須在 URL 中以字串格式指定。下表說明可以傳送至 URL 的型別和使用的格式。
型別 | 格式 |
---|---|
0 - 255 |
|
-128 - 127 |
|
-32768 - 32767 |
|
-2,147,483,648 - 2,147,483,647 |
|
-9,223,372,036,854,775,808 - 9,223,372,036,854,775,807 |
|
0 - 65535 |
|
0 - 4,294,967,295 |
|
0 - 18,446,744,073,709,551,615 |
|
-3.402823e38 - 3.402823e38 (不需要指數標記法) |
|
-1.79769313486232e308 - 1.79769313486232e308 (不需要指數標記法) |
|
任何單一字元 |
|
標準標記法中任何一個小數 (不含指數) |
|
True 或 False (不區分大小寫) |
|
任何字串 (不支援 null 字串且不會進行逸出) |
|
MM/DD/YYYY MM/DD/YYYY HH:MM:SS [AM|PM] 月/日/年 月/日/年 HH:MM:SS [AM|PM] |
|
DD.HH:MM:SS 其中 DD = 天數,HH = 小時,MM = 分鐘,SS = 秒數 |
|
GUID,例如: 936DA01F-9ABD-4d9d-80C7-02AF85C822A8 |
|
MM/DD/YYYY HH:MM:SS MM:SS 其中 DD = 天數,HH = 小時,MM = 分鐘,SS = 秒數 |
|
Enums |
列舉值,例如,如下列程式碼所示定義列舉。
任何個別的列舉值 (或其對應的整數值) 都可以在查詢字串中指定。 |
具有可以在型別和字串表示之間相互轉換之 TypeConverterAttribute 的型別。 |
取決於型別轉換子。 |
WebGet 和 WebInvoke
除了各種叫用動詞 (例如,HTTP POST、SOAP 服務所使用的動詞) 之外,Web 樣式服務還會使用擷取動詞 (例如,HTTP GET)。Web 程式設計模型可讓服務開發人員使用 WebGetAttribute 和 WebInvokeAttribute,同時控制 URI 範本和與其服務作業相關聯的動詞。WebGetAttribute 和 WebInvokeAttribute 可讓您控制個別作業如何繫結至 URI 及與這些 URI 相關聯的 HTTP 方法。例如,在下列程式碼中新增 WebGetAttribute 和 WebInvokeAttribute。
[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 支援。