逐步解說:使用型別提供者存取 Web 服務 (F#)
這個逐步解說會示範如何使用在 F# 3.0 存取 Web 服務的 Web 服務描述語言 (WSDL) (WSDL) 型別的提供者。在.NET語言中,若要產生程式碼來存取網路服務,您可以呼叫svcutil.exe,或者用 Add Web Reference選項,例如: 用一個C#專案讓Visual Studio呼叫svcutil.exe。在 F# 中,您會使用 WSDL 型別的其他選項提供者而言,接著,當您要建立 WsdlService 型別內的程式碼,產生型別都能使用。在撰寫程式碼時,這個處理序是依賴這項服務可供使用。
這個逐步解說將說明下列工作:您必須先完成它們按照本逐步解說的這個順序才會成功:
建立專案
設定型別提供者
呼叫 Web 服務和管理結果
建立專案
在步驟中,您會建立專案並將適當的參考使用 WSDL 型別的提供者。
建立並設定此專案
開啟新的主控台應用程式專案。
在 [方案總管] 中,以滑鼠右鍵按一下專案資料夾,然後選擇 [加入],接著在捷徑功能表上按一下 [加入資源]。
在 Assemblies區塊中,選擇Framework,然後,在可用應用程式的清單中,選取 System.Runtime.Serialization及System.ServiceModel。
在Assemblies區塊中,選取 Extensions。
從可用專案的清單中,選取 FSharp.Data.TypeProviders,,接著點選 OK 以在配件中加入參考資料。
設定型別提供者
在這個步驟中,您使用 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">
一個紅色 Squiggle 出現在這個程式碼行之下,如果服務 URI 拼錯或服務,則已經關閉或不會執行。如果您指向程式碼,錯誤訊息會描述此問題。針對多數的錯誤查詢,您可以按一下 錯誤清單在視窗中或者跳出的視窗中 以取得詳細資訊。
有兩種方式指定組態設定 WSDL 連接,可以使用 app.config 檔案的專案,也可以使用靜態型別參數在這種提供者宣告。您可以使用 svcutil.exe 產生適當的組態檔項目。如需使用的 svcutil.exe 詳細資訊產生 Web 服務的組態資訊,請參閱 ServiceModel Metadata Utility Tool (Svcutil.exe)。對於靜態型別參數的完整說明 WSDL 的輸入提供者的詳細資訊,請參閱 WsdlService 型別提供者 (F#)。
呼叫 Web 服務和管理結果
每個 Web 服務會使用做為參數呼叫其方法中的一組型別。在這個步驟中,您已經準備好這些參數,呼叫 Web 方法,並傳回的資訊。
呼叫 Web 服務和管理結果
Web 服務可能會逾時或停止運作,因此,在例外處理 (Exception Handling) 區塊應該包含 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
請注意您所建立的 Web 服務是需要的,例如 Place 和 Location的資料型別,在中,因為在 WsdlService 底下的巢狀型別輸入 TerraService。