1

我有以下客户端代码:

|>! 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 手册中不起作用。我什至记得那样使用它,所以我不知道出了什么问题。

编辑:这是查询的定义:

type Query =
    | GetBugs
    | GetBugInfo of int
4

1 回答 1

2

错误发生在运行时而不是编译时这一事实绝对是一个错误,我将在周一尝试重现和修复。

从技术上讲,由于 AsyncReplyChannel<'T> 没有默认构造函数,WebSharper 无法为其构造反序列化器。

看着更高的层次,我无法理解你的意图。为什么要通过 RPC 发送函数同构类型?

此外,这:

|>! OnClick (fun _ _ -> Server.CreateBug input.Value |> Server.SendCommand)

在我看来,这就像在服务器上构造一个对象的尝试,然后将它无偿地发送给客户端并返回,然后用它做一些事情——对吗?我假设 Server.* 函数在服务器上执行。如果是这样,则必须将其重构为单个调用:

|>! OnClick (fun _ _ -> Server.SendBugCommand input.Value)

[<Rpc>]
let SendBugCommand x =
    CreateBug x
    |> SendCommand
于 2011-07-30T18:23:43.723 回答