尝试在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>)
你可能会成功。尝试制作新的解决方案。
参考:
将以下代码粘贴到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#等效工作正常
答案 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ø