F#WsdlService类型提供程序代理

Jam*_*xon 1 f# type-providers

我正在关注此处找到的WsdlService类型提供程序的MSDN教程.当我在家里运行时,它按预期工作.当我在工作中编写相同的代码时,我得到一个设计时异常:

类型提供程序'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders'报告错误:错误:无法从http://msrmaps.com/TerraService2.asmx?WSDL获取元数据

工作确实使用代理,我必须改变web.config,以便在VS2012中从C#项目中使用WSDL时使用默认代理.当我查看类型提供程序的参数时,我没有看到有关代理的提及.有没有人有什么建议?

提前致谢.

lat*_*kin 5

扩展Tomas的答案......

这是当今内置类型提供程序中的常见模式:

  1. 在设计时,如果您需要任何类型的非默认配置(例如凭据,代理配置,...),类型提供程序将无法工作.您需要在本地下载一些模式文件(例如,DB模式文件,ODATA $元数据文件,WSDL模式文件......),并指向类型提供程序,通常是通过传入LocalSchemaFile="...", ForceUpdate=false静态构造函数.这为TP提供了生成类型所需的所有信息.
  2. 然后,以编程方式在为您创建的对象上设置所有非默认配置,以便一切都在运行时工作.

这是基本相同问题的另一个示例,其中此模式用于设置凭据.

在WSDL的情况下,下面是在事后设置代理的程序化方法(即步骤#2).在C#中完全依赖于这个答案,这正是你想要的.您可能需要稍微玩一下才能使它适合您.

#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)
Run Code Online (Sandbox Code Playgroud)