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

时间:2014-02-28 13:05:16

标签: web-services amazon-ec2 f# wsdl type-providers

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

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

但是当我下载wsdl时,请将其重命名为.wsdlschema,并根据this example中指定的方法将其作为本地架构提供:

type ec2 = WsdlService< ServiceUri="N/A", ForceUpdate = false, 
                          LocalSchemaFile = """C:\ec2.wsdlschema""">

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 online可以正常工作。< / p>

1 个答案:

答案 0 :(得分: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>