逐步解說:使用類型提供者存取 Web 服務 (F#)
屬性逐步解說示範如何使用 Web 服務描述語言 (WSDL) 類型提供者,此提供者可在 F# 3.0 中用於存取 WSDL 服務。 在其他 .NET 語言中,您可以產生程式碼來透過呼叫 svcutil.exe 存取 Web 服務,只在 C# 專案中加入 Web 參考,讓 Visual Studio 呼叫svcutil.exe。 在 F# 中,您可以另外選擇使用 WSDL 類型提供者,因此,當您撰寫建立 WsdlService 類型的程式碼時,就會立即產生類型並可使用。 此流程的完成有賴於撰寫程式碼時,服務可供使用。
本逐步解說將說明下列工作。 您必須按照逐步解說的這個順序完成才會成功:
建立專案
設定類型提供者
呼叫 Web 服務和處理結果
建立專案
在此步驟中,您會建立專案並加入適當的參考以使用 WSDL 類型提供者。
若要建立和設定 F# 專案
開啟新的 F# 主控台應用程式專案。
在 [方案總管] 中,開啟專案之 [參考] 節點的捷徑功能表,然後選擇 [加入參考]。
在 Assemblies區域中,選擇Framework,然後,在可用組件的清單中選擇 System.Runtime.Serialization及System.ServiceModel。
在Assemblies區塊中選擇 Extensions。
從可用組件的清單中,選取 FSharp.Data.TypeProviders,然後選擇 [確定] 按鈕,在組件中加入參考資料。
設定類型提供者
在這個步驟中,您使用 WSDL 類型提供者產生 TerraServer Web 服務的類型。
若要設定類型提供者和產生類型
加入下列程式碼行,以開啟類型提供者命名空間。
open System open System.ServiceModel open Microsoft.FSharp.Linq open Microsoft.FSharp.Data.TypeProviders
加入下列程式碼行,以 Web 服務叫用類型提供者。 在此範例中,請使用 TerraServer Web 服務。
type TerraService = WsdlService<"http://msrmaps.com/TerraService2.asmx?WSDL">
如果服務 URI 拼錯,或者服務本身已關閉或不在執行中,則此程式碼行底下會出現紅色波浪線。 如果您指向程式碼,錯誤訊息會描述此問題。 您可以在建置後,於 [錯誤清單] 視窗或 [輸出視窗] 中找到相同的資訊。
有兩種方式可指定 WSDL 連接的組態設定,一種是使用專案的 app.config 檔,另一種是在類型提供者宣告中使用靜態類型參數。 您可以使用 svcutil.exe 產生適當的組態檔項目。 如需有關使用 svcutil.exe 產生 Web 服務的組態資訊的詳細資訊,請參閱 ServiceModel 中繼資料公用程式工具 (Svcutil.exe)。如需 WSDL 類型提供者靜態類型參數的完整描述,請參閱 WsdlService 類型提供者 (F#)。
呼叫 Web 服務和處理結果
每個 Web 服務本身都有一組做為其方法呼叫參數的類型。 在這個步驟中,您需準備這些參數,呼叫 Web 方法,並處理傳回的資訊。
若要呼叫 Web 服務和處理結果
Web 服務可能會逾時或停止運作,因此,在例外狀況處理區塊中應該包含 Web 服務呼叫。 撰寫下列程式碼以嘗試從 Web 服務取得資料。
try let terraClient = TerraService.GetTerraServiceSoap () let myPlace = new TerraService.ServiceTypes.msrmaps.com.Place(City = "Redmond", State = "Washington", Country = "United States") let myLocation = terraClient.ConvertPlaceToLonLatPt(myPlace) printfn "Redmond Latitude: %f Longitude: %f" (myLocation.Lat) (myLocation.Lon) with | :? ServerTooBusyException as exn -> let innerMessage = match (exn.InnerException) with | null -> "" | innerExn -> innerExn.Message printfn "An exception occurred:\n %s\n %s" exn.Message innerMessage | exn -> printfn "An exception occurred: %s" exn.Message
請注意,您要在 WsdlService 類型 TerraService 下方建立 Web 服務需要的巢狀類型資料類型,例如 Place 和 Location。