我有以下客户端代码:
|>! OnClick (fun _ _ -> Server.CreateBug input.Value |> Server.SendCommand)
这是类型和服务器代码:
type Command =
| CreateBug of string
| Query of Query * AsyncReplyChannel<string>
[<Rpc>]
let SendCommand cmd =
dispatcher.Post cmd
客户端可以将其序列化为:[{“$”:0,“$ 0”:“test”}]
但是在调试时我得到以下日志错误:
WebSharper.Web错误:0:无法执行远程调用。无法获取JSON反序列化器:ClientReferral.Server + Command []
WebSharper错误:0:无法执行远程调用。无法获取JSON反序列化器:ClientReferral.Server + Command []
这段代码相当简单,似乎没有任何迹象表明它在WebSharper手册中不起作用。我甚至记得那样使用它,所以我不知道出了什么问题。
编辑: 这是Query的定义:
type Query =
| GetBugs
| GetBugInfo of int
答案 0 :(得分:2)
从技术上讲,由于AsyncReplyChannel&lt;'T&gt;没有默认构造函数WebSharper无法为它构造反序列化器。
从更高的层面来看,我无法理解你的意图。为什么要在RPC上发送函数同构类型?
此外,这:
|>! OnClick (fun _ _ -> Server.CreateBug input.Value |> Server.SendCommand)
这看起来像是试图在服务器上构造一个对象,然后无偿地将它发送到客户端并返回,然后用它做一些事情 - 这是对的吗?我假设Server。*函数在服务器上执行。如果是这样,它必须重构为一次调用:
|>! OnClick (fun _ _ -> Server.SendBugCommand input.Value)
[<Rpc>]
let SendBugCommand x =
CreateBug x
|> SendCommand