F#交互式 vs. F#解决方案和WCF

6

请在F#交互环境中运行以下代码:

#r "System.ServiceModel"
#r "System.Runtime.Serialization"

open System.ServiceModel

[<ServiceContract>]
type IWCF =
  [<OperationContract>]
  abstract Ping: float -> unit

type WCF () =
  interface IWCF with
    member o.Ping a = printfn "Hello, %g" a

let svh = new ServiceHost (typeof<WCF>)

你很有可能会成功。尝试创造一个新的解决方案。

参考文献:

  • System.Runtime.Serialization
  • System.ServiceModel

将以下代码粘贴到 Program.fs 中:

open System.ServiceModel

[<ServiceContract>]
type IWCF =
  [<OperationContract>]
  abstract Ping: float -> unit

type WCF () =
  interface IWCF with
    member o.Ping a = printfn "Hello, %g" a

let svh = new ServiceHost (typeof<WCF>)

运行程序时,我遇到了以下错误:

构成服务合同的操作中使用的所有参数名称都不能为null。 参数名:name

出了什么问题?

PS:我使用的是Visual Studio 2010 Ultimate SP1

编辑:只是为了确保,C#等效代码可以正常工作。


你有仔细检查过你的代码是否针对正确版本的 .NET 运行时吗?据我记得,在 VS 2010 中,F# 控制台应用程序的默认设置是 .NET 4 客户端配置文件,这不是完整的 .NET 配置文件,有时会导致类似“在这里可以运行但在其他地方却不行”的问题。 - pblasucci
2个回答

7
问题确实在于你需要为WCF操作中的参数命名。
以下是一个解决方案,用于在其中获取命名参数(像你一样将其命名为a)-至于为什么在F# -Interactive中可以工作?不清楚,也许它会在那里放置一些标准参数名称。 语法略有奇怪,但你可以在F#中为参数定义名称,请尝试:
[<ServiceContract>]
type IWCF =
  [<OperationContract>]
  abstract member Ping: a:float -> unit

注意:我不确定你是否需要在其中加入member,但我查看了一些文件并将其放在那里。我现在没有编译器,所以我会让它保持原样,以防你真的需要它(但我认为不需要)。


谢谢,这很有帮助!我不知道接口成员的参数也可以有名称。 - Oldrich Svec

1

我知道这个问题已经被标记为已回答,但我遇到了同样的异常消息,原因完全不同。我发帖只是为了提醒其他人,如果他们遇到了同样的问题,可能是由于和我一样的原因。

在我的情况下,我使用dotNET_Reactor对我的service.exe进行混淆,使用了标志“-exclude_types 1 -necrobit 1 -mapping_file 1”,除了-file和-targetfile之外。

我还没有追踪实际的“为什么”它不起作用,但删除混淆有所帮助。很让人沮丧的是,从Visual Studio中一切正常,但在同一台机器上安装应用程序(由构建服务器混淆)并启动服务时失败。

Bjørnar Sundsbø


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接