尽管我喜欢 F# 类型提供程序的想法,但我第一次认真尝试使用它们时失败了。
我打算通过以下方式连接到服务(WCF)WsdlService<"http://someurl/some.svc?wsdl">
它失败了:
类型提供程序 'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders' 报告错误:tmp6E6C.cs(9409,26): error CS0644: 'System.ComponentModel.PropertyChangedEventHandler' 不能从特殊类 'System.MulticastDelegate' c 派生:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll:(与先前错误相关的符号位置)
以及许多其他可能不相关的警告:
tmp6E6C.cs(290,28):警告 CS0436:“c:\Users\someuser\AppData\Local\Temp\tmp6E6C.cs”中的“System.Data.DataRowState”类型与导入的“System.Data”类型冲突。 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Data.dll' 中的 DataRowState'。使用 'c:\Users\someuser\AppData\Local\Temp\tmp6E6C.cs' 中定义的类型。tmp6E6C.cs(9427,17):(与先前警告相关的符号位置)
这是一个已知的功能;-) 还是我用错了?
不幸的是,我不能发布 WSDL,而且它相当大,里面有很多类型,所以我必须承认我有点懒惰,也没有把它删减。OTOH,如果我确实知道 WSDL 的哪一部分有问题或造成了这个错误,我当然会把它放在这里。
更改 WSDL 也不是一种选择,所以我主要想知道为什么 F# WSDL 类型的提供程序不能处理这个 (WCF) WSDL,或者我做错了什么。
当被 C# 和 VS2010 中的 svcutil.exe 使用时,它工作得很好。
我已经尝试了 WsdlTypeProvider 的所有参数,它们确实给出了相同的结果(当然 ForceUpdate 除外)。我是否应该使用 F# 以另一种方式使用这些服务?
==================================================== ============================添加信息(因为我是新手,不想回答。不要问为什么:):
谢谢大家的回答/评论。
我确实部分地这样做了(手动使用 svcutil)。正如我上面所说的,我尝试手动使用 svcutil,但在编译生成的 C# 代码时失败(在 F# 之外的库中)。
也就是说,我做了以下事情:
1) 通过在 VS 2010 GUI 中设置引用来创建合约。这按预期工作
2) 尝试使用命令行中的 svcutil 创建它。然后该文件的编译失败并出现相同的错误。
从我的角度来看,从 cmd-line 在 svcutil 中发生的情况以及从 GUI 添加相同服务时使用 svcutil(或使用的内容)不会生成具有相同参数的代码。我想这部分是由于我尝试使用的是 WCF 服务而不是“干净”的 WSDL/web 服务,并且类型提供程序假定我尝试使用“干净”的 web 服务。
我没有找到任何 svcutil 的参数来处理这个问题,或者任何可能的参数组合,并不是说我确实尝试了所有组合排列,而是尝试了可能基于(试图)深入阅读 svcutil 文档的组合(而且我不是从 cmd-line 使用它的新手)。
到目前为止,我得出的结论是 svcutil 的一些“缺失”参数导致了这种情况,并且 F# 类型提供程序没有错。我仍然非常想以某种方式解决它,仍然使用 F# 类型提供程序,但后备是通过 C# 中的 GUI 生成代码,然后再次在 F# 中引用该部分代码。这不是我试图实现的优雅解决方案,因为我确实有很多服务,而且我非常想创建一种很好的原型设计和测试这些服务的方式。
另一个后备当然也会放弃整个 F# 部分而只进行一些单元测试等,但这又违背了潜入 F# 并同时学习的目的;-)