.net F#类型提供程序无法加载类型
我正在尝试使用F#类型提供程序编写一个简单的SOAP客户端。完整的程序是:.net F#类型提供程序无法加载类型,.net,soap,f#,wsdl,type-providers,.net,Soap,F#,Wsdl,Type Providers,我正在尝试使用F#类型提供程序编写一个简单的SOAP客户端。完整的程序是: open System open System.Runtime.Serialization open System.ServiceModel open Microsoft.FSharp.Data.TypeProviders type EntrezService = WsdlService<"http://eutils.ncbi.nlm.nih.gov/soap/v2.0/eutils.wsdl"> [&l
open System
open System.Runtime.Serialization
open System.ServiceModel
open Microsoft.FSharp.Data.TypeProviders
type EntrezService = WsdlService<"http://eutils.ncbi.nlm.nih.gov/soap/v2.0/eutils.wsdl">
[<EntryPoint>]
let main argv =
let client = EntrezService.GeteUtilsServiceSoap()
try
let req = EntrezService.ServiceTypes.eSearchRequest()
let res = client.run_eSearch req
printfn "%A" res
with
| ex ->
let rec inner (ex : Exception) =
if ex.InnerException <> null then
inner ex.InnerException
printfn "%s" ex.Message
inner ex
0
开放系统
open System.Runtime.Serialization
开放系统.ServiceModel
打开Microsoft.FSharp.Data.TypeProviders
输入EntrezService=WsdlService
[]
让主argv=
让client=EntrezService.GeteUtilsServiceSoap()
尝试
let req=EntrezService.ServiceTypes.esearch请求()
让res=client.run\u eSearch req
printfn“%A”res
具有
|ex->
let rec内部(例如:异常)=
如果ex.InnerException为null,则
内部ex.InnerException
打印“%s”例如消息
内奸
0
不幸的是,应用程序似乎在进行SOAP调用之前就崩溃了,出现以下TypeLoadException:
无法从程序集“EntrezGeneAdapter”加载类型“UrlTypeLNG”,
版本=0.0.0.0,区域性=中性,PublicKeyToken=null'
此类型在WSDL中定义。我不知道.NET为什么会尝试从我的程序集中加载它
堆栈跟踪表示异常是从System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping
引发的
这里发生了什么,有简单的解决方法吗?等效程序在C#中运行良好,那么这是F#类型提供程序的问题吗?在两种情况下,我遇到了类型提供程序在编译时运行的问题,但在FSI中不运行(反之亦然)。你可能已经发现第三个一类提供者仍然有点尖端
Common7
目录结构中,从那时起,FSI(和类型提供程序)一直使用那里的版本,因为Visual Studio在启动时加载它们。我花了好几个月才弄清楚到底发生了什么不知道这两个问题是否都是您的问题,但可能值得检查。问题似乎是由WSDL引起的。该服务定义了一个名为“UrlType”的复杂类型,其中包含一个名为“LNG”的属性。不知何故,这被错误地组合到“UrlTypeLNG”中。我手动编辑了WSDL以使用普通字符串而不是复杂类型,现在它似乎可以正常工作。如果您使用的是第三方服务,而您无法编辑其WSDL,则仍然可以绕过此问题。诀窍是在定义WSDL服务类型时使用
LocalSchemaFile
和ForceUpdate
。在LocalSchemaFile
中指定.wsdlschema
文件名将创建所述文件并定期在其中存储缓存的WSDL。要防止定期重新生成此文件,还应包括ForceUpdate=false
。这允许您对类型提供程序使用的特定WSDL进行更改。确保每次都重新生成,以使更改生效。还请注意,如果第三方服务的WSDL发生更改,您可能必须手动重做此过程
类型定义可以如下所示:
type SomeService = WsdlService<"http://3rdparty.net/wsdl/srv.wsdl",
LocalSchemaFile = "srv_local.wsdlschema",
ForceUpdate = false>
键入SomeService=WsdlService
您的应用程序使用的目标.NET framework版本是什么。NET framework从程序集中加载类型,因为WsdlService生成了类型提供程序,并在程序集中以实类型编译所有类型。顺便说一句,我使用的是.NET4.5,我的FSI中的所有功能都正常。这对你来说很有意思。我将尝试从另一个框运行我的程序。也许我有某种配置问题。我在另一个盒子里试过,结果还是一样的错误。FWIW,我正在编译而不是从FSI运行。FWIW,我也能够在FSI中工作。知道为什么编译时它不工作吗?真正的魔法;)行为取决于服务。你能从你的机器上尝试另一个wsdl服务吗?是的,我就是这么做的。谢谢。这也是一项公共服务。