2013-09-24 104 views
1

我正在關注找到的WsdlService類型提供程序的MSDN教程here。當我在家裏運行它時,它按預期工作。當我寫在工作相同的代碼,我得到一個設計時異常:F#WsdlService類型提供程序代理

The type provider 'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders' reported an error: Error: Cannot obtain Metadata from http://msrmaps.com/TerraService2.asmx?WSDL

工作時使用代理,我要改變web.config文件從C#項目使用WSDL時要使用一個默認代理在VS2012。當我查看類型提供者的參數時,我沒有看到關於代理的提及。有沒有人有什麼建議?

在此先感謝。

回答

3

我沒有通過代理進行連接,所以我沒有辦法實際測試這個,但我認爲您應該可以使用本地WSDL文件在設計器中加載類型提供程序。

嘗試下載WSDL模式(從http://msrmaps.com/TerraService2.asmx?WSDL)並將其保存到本地文件(如C:\temp\terra.wsdlschema)。那麼你應該能夠編寫:

#r "System.ServiceModel.dll" 
#r "FSharp.Data.TypeProviders.dll" 
open Microsoft.FSharp.Data.TypeProviders 

type Terra = WsdlService< ServiceUri="N/A", ForceUpdate = false, 
          LocalSchemaFile = @"C:\temp\terra.wsdlschema"> 
let terra = Terra.GetTerraServiceSoap() 
terra.GetPlaceList("New York", 1, false) 

ServiceUri參數似乎是必需的,但它應該被忽略,如果你添加ForceUpdate=false。它應該只需要緩存的WSDL文件。我不完全知道如何配置運行時來使用你的配置文件設置,但我相信這可以通過某種方式完成(或者它可以工作,或者你可以傳遞一些東西到GetTerraServiceSoap方法)。

不幸的是,類型提供者並沒有靜態地知道(在設計時)在哪裏尋找配置文件,所以它忽略了它。

+0

啊 - 我不知道在未來型供應商可以添加一些構造函數在那裏我可以與所需的代理信息的結構通過。我認爲已經有9個參數了,還有更多? –

5

擴大對托馬斯的答案...

這是內置型供應商今天在一份共同的模式:

  1. 在設計時,如果你需要任何種類的非默認配置(例如憑證,代理配置等),類型提供程序將不起作用。您需要在本地下載某個模式文件(例如數據庫模式文件,ODATA $元數據文件,WSDL模式文件...),並指定類型提供程序,通常通過在靜態構造函數中傳遞LocalSchemaFile="...", ForceUpdate=false。這爲TP提供了生成類型所需的所有信息。
  2. 然後,以編程方式在爲您創建的對象上設置所有非默認配置,以便在運行時正常工作。

這裏的another example基本上是相同的問題,其中這種模式用於設置憑據。

在WSDL的情況下,下面是用於事後設置代理的編程方法(即步驟#2)。在C#中完全從this answer中挑出,這正是你想要的。您可能需要使用這一點來使它適合您。

#r "System.ServiceModel.dll" 
#r "FSharp.Data.TypeProviders.dll" 
open Microsoft.FSharp.Data.TypeProviders 

type Terra = WsdlService< ServiceUri="N/A", ForceUpdate = false, 
          LocalSchemaFile = @"C:\temp\terra.wsdlschema"> 
let terra = Terra.GetTerraServiceSoap() 

let binding = terra.DataContext.Endpoint.Binding :?> System.ServiceModel.BasicHttpBinding 
binding.ProxyAddress <- System.Uri("http://127.0.0.1:8888") 
binding.BypassProxyOnLocal <- false 
binding.UseDefaultWebProxy <- false 

terra.GetPlaceList("New York", 1, false) 
相關問題