チュートリアル : 型プロバイダーを使用した Web サービスへのアクセス (F#)
このチュートリアルでは、F# 3.0 で利用可能な Web サービス記述言語 (WSDL) 型プロバイダーを使用して WSDL サービスにアクセスする方法を説明します。 他の .NET 言語では、svcutil.exe を呼び出すか、または Web 参照を追加して Web サービスにアクセスするためのコードを生成します。たとえば、C# プロジェクトの場合は、Visual Studio で svcutil.exe を呼び出します。 F# では、WSDL 型プロバイダーを使用する追加オプションがあるので、WsdlService 型を作成するコードを記述するとすぐに型が生成されて使用できるようになります。 このプロセスは、コードを記述するときに利用できるサービスに依存します。
このチュートリアルでは、次の作業について説明します。 このチュートリアルを正しく行うには、以下の作業を順に行ってください。
プロジェクトの作成
型プロバイダーの構成
Web サービスの呼び出しと結果の処理
プロジェクトの作成
この手順では、プロジェクトを作成し、WSDL 型プロバイダーを使用するために適切な参照を追加します。
F# プロジェクトを作成してセットアップするには
新しい F# コンソール アプリケーション プロジェクトを開きます。
ソリューション エクスプローラーで、プロジェクトの [参照] ノードのショートカット メニューを開き、[参照の追加] をクリックします。
[アセンブリ] 領域で、[フレームワーク] を選択し、使用できるアセンブリの一覧から、System.Runtime.Serialization と System.ServiceModel を選択します。
[アセンブリ] 領域で、[拡張機能] を選択します。
使用可能なアセンブリの一覧で、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">
サービス URI にスペル ミスがある場合、サービス自体が停止している場合、または動作していない場合は、このコード行の下に赤の波線が表示されます。 コードをポイントすると、問題を説明するエラー メッセージが表示されます。 ビルド後は、[エラー一覧] ウィンドウまたは出力ウィンドウでも同じ情報を確認できます。
WSDL 接続の構成設定を指定するには、プロジェクトの app.config ファイルを使用する方法と、型プロバイダーの宣言で静的な型パラメーターを使用する方法の 2 とおりあります。 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
Place や Location など、Web サービスに必要なデータ型は、WsdlService 型の TerraService の下に入れ子にされた型として作成します。