2014-02-28 51 views
2

我正在嘗試F#中的類型提供程序。我已經使用WsdlService提供商以下列方式取得了一些成功:使用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中發出錯誤消息:

The type provider 'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders' reported an error: Error: No valid input files specified. Specify either metadata documents or assembly files

此消息是錯誤,因爲該文件很明顯是有效的,如前面的例子所證明的。

我考慮過權限問題,並且從我的用戶文件夾中重複了相同的示例,確保在這兩種情況下都向所有用戶授予完全控制權,並且以管理員身份運行VS。

爲什麼F#編譯器認爲該文件無效?

編輯#1:我已經證實,做同樣的事情對http://gis1.usgs.gov/arcgis/services/gap/GAP_Land_Cover_NVC_Class_Landuse/MapServer?wsdl(USGS與植被有關的API)不起作用,而引用wsdl在線工作正常。

回答

7

嗯,看起來類型提供者是相當固執和不靈活的,因爲它在使用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> 
+0

謝謝,這似乎工作!出於好奇,你是怎麼解決問題的?我無法在Google上找到任何解釋'wsdlschema'的內容,並且沒有關於TypeProvider的文檔來告訴您它期望的是什麼。這也不符合其他用戶的體驗,只需提供wsdl即可正常工作。我想我會爲此提出一個錯誤報告。 –

+0

我記得在爲上面鏈接的問題寫回答時通過它。另外你可以直接從代碼中讀取邏輯。請參閱當使用LocalSchemaFile時調用的'else'子句[此處](https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Data.TypeProviders/TypeProvidersImpl.fs#L685) '和'ForceUpdate = false'。你可以看到[這裏](https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Data.TypeProviders/TypeProvidersImpl.fs#L620)'unpackFolder'假定包裝XML存在。 – latkin

+0

而且我不認爲這可能適用於本地的just-WSDL文件。如果你能指出一個例子,會很好奇。它*會*指向URI中的一個* remote * .wsdl - 在這種情況下,會有一些額外的抓取邏輯。 – latkin