我在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>
答案 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>