F#interactive与F#解决方案和WCF

时间:2011-09-30 10:56:39

标签: wcf f#

尝试在F#interactive中运行它:

#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>)

然后运行它。我收到以下错误:

  

构成服务合同的操作中使用的所有参数名称不得为空。参数名称:名称

有什么问题?

PS:我使用Visual Studio 2010 Ultimate SP1

编辑:只是为了确保,C#等效工作正常

2 个答案:

答案 0 :(得分:7)

问题确实是你需要为WCF-Operations中的参数命名。

这是一个获取命名参数的解决方案(就像你一样命名为a) - 为什么它在F#-Interactive中工作?没有任何线索,也许它为那里的参数设置了一些标准名称。 语法有点奇怪,但您可以在F#中定义参数的名称,请尝试:

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

注意:我不知道你是否需要member,但我刚检查了一些文件,并确实把它放在那里。我没有围绕ATM的编译器所以我会让它坐在那里以防你真的需要它(但我不这么认为)

答案 1 :(得分:1)

我知道这个问题已被标记为已回答,但我遇到了相同的异常消息,原因完全不同。我发帖以防万一其他人遇到同样的问题我也有同样的问题。

在我的情况下,除了-file和-targetfile之外,我还使用dotNET_Reactor来混淆我的service.exe,标志为'-exclude_types 1 -necrobit 1 -mapping_file 1'。

我没有找到实际的“为什么”它不起作用,但删除混淆有帮助。知道Visual Studio中的一切工作非常令人沮丧,但是在启动服务时在同一台机器上安装应用程序(由构建服务器进行了模糊处理)失败了。

BjørnarSundsbø