1

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

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

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

提前致谢。

4

2 回答 2

5

扩展托马斯的答案......

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

  1. 在设计时,如果您需要任何类型的非默认配置(例如凭据、代理配置等),类型提供程序将不起作用。您需要在本地下载一些模式文件(例如 DB 模式文件、ODATA $metadata 文件、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)
于 2013-09-25T22:17:09.257 回答
4

我没有通过代理连接,所以我无法实际测试它,但我认为您应该能够使用本地 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方法)。

遗憾的是,类型提供程序并不静态知道(在设计时)在哪里寻找配置文件,所以它忽略了它。

于 2013-09-24T14:37:44.447 回答