【发布时间】:2015-01-24 06:21:47
【问题描述】:
我正在尝试使用 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
不幸的是,看起来应用在进行 SOAP 调用之前就崩溃了,并出现以下 TypeLoadException:
无法从程序集“EntrezGeneAdaptor”加载类型“UrlTypeLNG”, 版本=0.0.0.0,文化=中性,PublicKeyToken=null '。
此类型在 WSDL 中定义。我不知道为什么 .NET 会尝试从我的程序集中加载它。
堆栈跟踪表明异常是从System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping 引发的。
这是怎么回事,有没有简单的解决方法?等效程序在 C# 中运行良好,那么这是 F# 类型提供程序的问题吗?
【问题讨论】:
-
您的应用程序使用的目标 .NET 框架版本是什么? .NET 框架从您的程序集中加载类型,因为 WsdlService 生成了类型提供程序,并且它在您的程序集中以真实类型编译所有类型。顺便说一句,一切都在我的 FSI screencast.com/t/H6ax57QAM1
-
我使用的是 .NET 4.5。有趣的是它对你有用。我会尝试从另一个盒子运行我的程序。也许我有某种配置问题。
-
我在另一个盒子里试了一下,得到了同样的错误。 FWIW,我正在编译而不是从 FSI 运行。
-
FWIW,我也能够在 FSI 中使用它。知道为什么编译时它不起作用吗?
-
真正的魔法 ;) 行为取决于服务。你能从你的机器上尝试另一个 wsdl 服务吗?
标签: .net soap f# wsdl type-providers