演练:使用类型提供程序访问 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# 项目

  1. 打开新的 F# 控制台应用程序项目。

  2. 在**“解决方案资源管理器”中,打开项目的“引用”节点的快捷菜单,然后选择“添加引用”**。

  3. 在**“程序集”区域中,选择“框架”**,然后在可用的程序集列表中选择 System.Runtime.SerializationSystem.ServiceModel

  4. 在**“程序集”区域中,选择“扩展”**。

  5. 在可用的程序集列表中,选择 FSharp.Data.TypeProviders,然后选择**“确定”**按钮可以添加这些程序集的引用。

配置类型提供程序

在此步骤中,您使用 WSDL 类型提供程序可以生成 TerraServer Web 服务的类型。

配置类型提供程序和生成类型

  1. 将以下代码行以打开类型提供程序命名空间。

    open System
    open System.ServiceModel
    open Microsoft.FSharp.Linq
    open Microsoft.FSharp.Data.TypeProviders
    
  2. 添加以下代码行以调用带 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 下以嵌套类型的形式而创建。

请参见

参考

WsdlService 类型提供程序 (F#)

其他资源

类型提供程序