[VS2010] WCF 4.0 新功能 (4): 服務說明頁與錯誤處理

[VS2010] WCF 4.0 新功能 (4): 服務說明頁與錯誤處理

有寫過 ASP.NET Web Service 的人都知道,若要取得 ASP.NET Web Service 的方法說明,只要使用 http://[URL]/[Service].asmx 就可以看到 Web Service 的資訊頁面,但到了 WCF Service 時,這個機制就沒有作用了 (改由 svcutil.exe 產生中繼資料),因為應用程式基本上是不應該輸出太多技術細節,就怕會被有心人士拿來利用,不過若是要開放給公眾使用的 Web Service,若都要用 svcutil.exe 來做,那也不太方便,因此 WCF 4.0 的 REST 服務功能特別在 WebHttpBehavior 中加入一個功能,可以讓服務產生說明的文件,提供開發人員存取 REST API 必要的資料格式與呼叫方法的說明。

image

 

說明文件中會列舉出服務所顯露的 OperationContract 所宣告的方法,點選其中一個 OperationContract 的方法,即可得到細部的技術資訊:

image

 

若要開放這樣的說明文件其實很簡單,只要在 WebServiceHost 中的 EndpointBehavior 中加入 WebHttpBehavior,並且設定 HelpEnabled = true 即可:

static void Main(string[] args)
{
    WebServiceHost host = new WebServiceHost(typeof(ProductQuery), new Uri("
http://localhost:8080/ProductQuery"));
    host.AddServiceEndpoint(typeof(IProductQuery), new WebHttpBinding(), "");
    host.Description.Endpoints[0].Behaviors.Add(new WebHttpBehavior() { HelpEnabled = true });
    host.Open();

    Console.WriteLine("Press ENTER to stop this service.");
    Console.ReadLine();

    host.Close();
    host = null;
}

 

另外,在 WCF 4.0 的 REST Service 中,原有的 WCF 例外處理類別 FaultException 也特別因應 REST 功能修改為 WebFaultException 類別,它還有一個相似的類別 WebFaultException<T> 類別,這兩者的差異是泛型的類別可以額外裝載不同的錯誤訊息資料結構,例如下面的程式碼:

public string ErrorGet()
{
    throw new WebFaultException<string>("Single Error", System.Net.HttpStatusCode.BadRequest);
}

即可擲出一個 WebFaultException 例外,這個例外會轉換 HTTP 400 的 Bad Request 錯誤指令並送回用戶端,並且挾帶 “Single Error” 的訊息作為回應的訊息。
另一個具有相同能力的 WebFaultException 只能夠設定狀態碼,因此開發人員可以視情況來決定使用哪一種。

參考資料:

Error Handling in WCF WebHttp Services with WebFaultException

Clients and the Automatic Help Page in WCF WebHttp Services