使用F#WsdlService类型提供程序编译错误

Tom*_*m W 3 f# wsdl web-services amazon-ec2 type-providers

我在F#中尝试使用类型提供程序.我以下列方式使用WsdlService提供程序取得了一些成功:

type ec2 = WsdlService<"http://s3.amazonaws.com/ec2-downloads/ec2.wsdl">

但是当我下载wsdl时,将其重命名为.wsdlschema并根据此示例中指定的方法将其作为本地模式提供:

type ec2 = WsdlService< ServiceUri="N/A", ForceUpdate = false, 
                          LocalSchemaFile = """C:\ec2.wsdlschema""">
Run Code Online (Sandbox Code Playgroud)

Visual Studio发出错误消息:

类型提供程序'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders'报告错误:错误:未指定有效的输入文件.指定元数据文档或程序集文件

此消息是错误的,因为该文件非常明显有效,如前面的示例所证明的那样.

我已经考虑了权限问题,并且我在我的用户文件夹中重复了相同的示例,确保在这两种情况下都向所有用户授予完全控制权,以及以管理员身份运行VS.

为什么F#编译器认为该文件无效?

编辑#1:我已经确认做同样的事情不适用于http://gis1.usgs.gov/arcgis/services/gap/GAP_Land_Cover_NVC_Class_Landuse/MapServer?wsdl(USGS植物相关API),而引用wsdl在线工作正常.

lat*_*kin 9

嗯,似乎类型提供者相当顽固且不灵活,因为在使用该LocalSchemaFile选项时它需要一个真正的"wsdlschema"文档.wsdlschema文档中可以包含多个.wsdl和.xsd文件,包含在一些XML中以使它们分开.我猜这是微软工具链中的某种标准事物,但也许其他人(例如亚马逊)不会暴露这样的东西.

TP尝试做的第一件事就是将wsdlschema文件解压缩到它的各个部分,遗憾的是,如果实际上没有解压缩,它会做错事.然后,当它试图在解压缩的模式文件中指向svcutil.exe来执行codegen时,会因为您看到的错误消息而死亡.

解决方法:将预期的XML位添加到您的文件中,它将起作用.

<?xml version="1.0" encoding="utf-8"?>
<ServiceMetadataFiles>
  <ServiceMetadataFile name="ec2.wsdl">

  [body of your WSDL goes here]

  </ServiceMetadataFile>
</ServiceMetadataFiles>
Run Code Online (Sandbox Code Playgroud)