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 に答える