逐步解說:使用型別提供者存取 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。