.net F#类型提供程序无法加载类型

.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

我正在尝试使用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">

[<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中不运行(反之亦然)。你可能已经发现第三个一类提供者仍然有点尖端

  • 使用类型提供程序的应用中缺少程序集绑定重定向。在这里检查一些FSharp.Core
  • GAC或Visual Studio执行目录中的库。我曾经让一个nuget包将自己解压到Visual Studio的某个地方的
    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服务吗?是的,我就是这么做的。谢谢。这也是一项公共服务。