演练:使用类型提供程序访问 Web 服务 (F#)
本演练演示如何使用在 F# 3.0 访问 WSDL 服务中的可用的 Web 服务描述语言 (WSDL) 类型提供程序。 在其他 .NET 语言中,通过调用 svcutil.exe 或者使用**“添加 Web 引用”**选项来生成代码以访问 Web 服务,例如使用 C# 项目获取 Visual Studio 以供您调用 svcutil.exe。 在 F# 中,可以选择使用 WSDL 类型提供程序,因此尽快编写创建 WsdlService 类型的代码,生成类型并成为可用类型。 当您写入代码时可用此进程依赖在服务上。
本演练阐释了以下任务。 您必须按演练的此顺序完成这些步骤,才能成功:
Creating the project
Configuring the type provider
Calling the web service, and processing the results
创建项目
在步骤中,创建项目并添加适当的引用可以使用 WSDL 类型提供程序。
创建 F# 项目
打开新的 F# 控制台应用程序项目。
在**“解决方案资源管理器”中,打开项目的“引用”节点的快捷菜单,然后选择“添加引用”**。
在**“程序集”区域中,选择“框架”**,然后在可用的程序集列表中选择 System.Runtime.Serialization 和 System.ServiceModel。
在**“程序集”区域中,选择“扩展”**。
在可用的程序集列表中,选择 FSharp.Data.TypeProviders,然后选择**“确定”**按钮可以添加这些程序集的引用。
配置类型提供程序
在此步骤中,您使用 WSDL 类型提供程序可以生成 TerraServer Web 服务的类型。
配置类型提供程序和生成类型
将以下代码行以打开类型提供程序命名空间。
open System open System.ServiceModel open Microsoft.FSharp.Linq open Microsoft.FSharp.Data.TypeProviders
添加以下代码行以调用带 Web 服务的类型提供程序。 在此示例中,使用 Terraserver-usa web 服务。
type TerraService = WsdlService<"http://msrmaps.com/TerraService2.asmx?WSDL">
如果服务 URI 拼写错误,或该服务本身处于停机状态或未执行,则红色曲线将显示在代码行下。 如果您指向代码,一个错误消息描述问题。 生成后,您可以在**“错误表”窗口或在“输出窗口”**找到相同的信息。
通过使用该项目的 app.config 文件,或者通过使用在类型提供程序说明中的静态类型参数,具有两种方式为 WSDL 连接指定配置设置。 您可以使用 svcutil.exe 生成相应的配置文件元素。 有关使用 svcutil.exe 生成 web 服务的配置信息的更多信息,请参见 ServiceModel Metadata Utility Tool (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
请注意,Web 服务需要的数据类型,例如 Place 和 Location 在 WsdlService 类型 TerraService 下以嵌套类型的形式而创建。