WCF Web HTTP 程式設計模型概觀

Windows Communication Foundation (WCF) WEB HTTP 程式設計模型提供了使用 WCF 建置 WEB HTTP 服務所需的基本項目。 WCF WEB HTTP 服務的設計可供最廣泛用戶端存取,包括具有下列獨特需求的網頁瀏覽器:

  • URI 和 URI 處理:URI 在 WEB HTTP 服務的設計過程中,扮演很重要的角色。 WCF WEB HTTP 程式設計模型運用 UriTemplateUriTemplateTable 類別以提供 URI 處理能力。

  • 對 GET 和 POST 作業的支援:WEB HTTP 服務除有各種用於資料修改與遠端叫用的叫用動詞外,還運用了 GET 動詞來擷取資料。 WCF WEB HTTP 程式設計模型使用 WebGetAttributeWebInvokeAttribute,將服務作業同時與 GET 及其他 HTTP 動詞 (如 PUT、POST 和 DELETE) 產生關聯。

  • 多種資料格式:Web 樣式服務能夠處理包括 SOAP 訊息在內許多種類的資料。 WCF WEB HTTP 程式設計模型運用 WebHttpBindingWebHttpBehavior 以支援多種不同的資料格式,包括 XML 文件、JSON 資料物件,以及諸如影像、視訊檔或純文字之類的二進位內容資料流。

WCF WEB HTTP 程式設計模型將 WCF 的觸角延伸至擴及 Web 樣式案例,包括 WEB HTTP 服務、AJAX 和 JSON 服務,以及新聞訂閱 (ATOM/RSS) 摘要。 如需 AJAX 和 JSON 服務的詳細資訊,請參閱 AJAX 整合和 JSON 支援。 如需新聞訂閱的詳細資訊,請參閱 WCF 新聞訂閱概觀

可從 WEB HTTP 服務傳回的資料型別沒有額外的限制。 WEB HTTP 服務作業可傳回任何可序列化型別。 因為 WEB HTTP 服務作業可由 Web 瀏覽器叫用,所以可在 URL 中指定的資料型別具有一項限制。 如需預設支援之型別的詳細資訊,請參閱下列 UriTemplate 查詢字串參數和 URL 一節。 您可以提供自己的 T:System.ServiceModel.Dispatcher.QueryStringConverter 實作來變更預設行為,其中指定如何將 URL 中指定的參數轉換成實際的參數型別。 如需詳細資訊,請參閱 QueryStringConverter

警告

以 WCF WEB HTTP 程式設計模型所撰寫的服務並未使用 SOAP 訊息。 由於未使用 SOAP,即無法使用 WCF 提供的安全性功能。 不過,您可透過以 HTTPS 裝載服務的方式來使用傳輸型安全性。 如需 WCF 安全性的詳細資訊,請參閱安全性概觀

警告

安裝適用於 IIS 的 WebDAV 延伸模組可能會導致 Web HTTP 服務傳回 HTTP 405 錯誤,因為 WebDAV 延伸模組會嘗試處理所有 PUT 要求。 若要解決此問題,您可以解除安裝 WebDAV 延伸模組或停用網站的 WebDAV 延伸模組。 如需詳細資訊,請參閱 IIS 和 WebDav

使用 UriTemplate 和 UriTemplateTable 來進行 URI 處理

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

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

  • a/x/c

  • a/y/c

  • a/z/c

  • 依此類推。

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

.NET Framework 提供可以使用 UriTemplate 這種 URI 範本的應用程式開發介面。 UriTemplates 可讓您執行下列作業:

  • 您可以使用一組參數來呼叫其中一種 Bind 方法,以產生與範本相符的「完全封閉式 URI」。 意思就是,URI 範本中的所有變數都會以實際值來取代。

  • 您可以使用候選 URI 來呼叫 Match(),以便透過範本將候選 URI 切割為自身的構成部分,並傳回包含不同的 URI (已依據範本中的變數加上標籤) 部分的字典。

  • Bind() 和 Match() 都是反向值,因此您可以呼叫 Match( Bind( x ) ) 並從一開始的相同環境重新開始。

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

WCF 服務模型會透過 UriTemplateUriTemplateTable 將服務作業與 UriTemplate 所描述的 URI 集合關聯在一起。 服務作業會透過 UriTemplateWebGetAttribute,與 WebInvokeAttribute 產生關聯。 如需 UriTemplateUriTemplateTable 的詳細資訊,請參閱 UriTemplate 和 UriTemplateTable

WebGet 和 WebInvoke 屬性

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

[ServiceContract]
interface ICustomer
{
  //"View It"

  [WebGet]
  Customer GetCustomer():

  //"Do It"
    [WebInvoke]
  Customer UpdateCustomerName( string id,
                               string newName );
}

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

GET /GetCustomer

POST /UpdateCustomerName

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

[ServiceContract]
interface ICustomer
{
  //"View It" -> HTTP GET
    [WebGet( UriTemplate="customers/{id}" )]
  Customer GetCustomer( string id ):

  //"Do It" -> HTTP PUT
  [WebInvoke( UriTemplate="customers/{id}", Method="PUT" )]
  Customer UpdateCustomer( string id, Customer newCustomer );
}

若要查看使用 WCF WEB HTTP 程式設計模型的 WCF 服務完整範例,請參閱如何:建立基本 WCF Web HTTP 服務

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 = 秒數
列舉 列舉值,依下列程式碼示範的方式定義列舉。

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

任何個別的列舉值 (或其對應的整數值) 都可以在查詢字串中指定。
具有可以在型別和字串表示之間相互轉換之 TypeConverterAttribute 的型別。 取決於型別轉換子。

格式與 WCF WEB HTTP 程式設計模型

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

  • XML

  • JSON

  • 不透明的二進位資料流

這意味著 WCF WEB HTTP 程式設計模型能夠處理任何資料型別,但您還是可以針對 Stream 進行程式設計。

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

WCF WEB HTTP 程式設計模型和安全性

由於 WCF WEB HTTP 程式設計模型不支援 WS-* 通訊協定,保護 WCF WEB HTTP 服務安全的唯一方法是運用 SSL 透過 HTTPS 公開服務。 如需使用 IIS 7.0 設定 SSL 的詳細資訊,請參閱如何在 IIS 中實作 SSL

WCF WEB HTTP 程式設計模型疑難排解

當呼叫 WCF WEB HTTP 服務以使用 ChannelFactoryBase<TChannel> 建立通道時,WebHttpBehavior 會使用組態檔中設定的 EndpointAddress,即便傳遞至 EndpointAddressChannelFactoryBase<TChannel> 是另一個值亦然。

另請參閱