2011-07-30 3 views
1

У меня есть следующий код клиента:WebSharper не может десериализации профсоюзную типа

|>! 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": "тест"}]

Но тогда я получаю следующее сообщение об ошибке журнала при отладке:

WebSharper.Web Error: 0 : Failed to execute a remote call. Failed to get JSON deserializer for: ClientReferral.Server+Command[]

WebSharper Error: 0 : Failed to execute a remote call. Failed to get JSON deserializer for: ClientReferral.Server+Command[]

Этот код довольно тривиален и, похоже, ничего не говорит о том, что он не будет работать в руководстве по WebSharper. Я даже помню, как это использовал, поэтому я не знаю, что случилось.

Edit: Это определение запроса:

type Query = 
    | GetBugs 
    | GetBugInfo of int 
+0

Предполагается, что 'Query of Query' должен быть' Query of Command'? – ildjarn

+0

В принципе, я хочу отправить команды или запросы на сервер, запросы обычно будут завернуты в команду с помощью ReplyChannel и отправлены агенту. –

ответ

2

тот факт, что ошибка происходит во время выполнения, а не во время компиляции, безусловно, ошибка, я попытаюсь воспроизвести и исправить в понедельник.

Технически, поскольку AsyncReplyChannel < 'T> не имеет конструктора по умолчанию, WebSharper не может создать десериализатор для него.

Глядя на более высокий уровень, я не могу понять ваши намерения. Зачем посылать функцию-изоморфный тип по RPC?

Кроме того, это:

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

Это смотрит на меня, как попытка построить объект на сервере, а затем беспричинно отправить его клиенту и обратно, а затем сделать что-то с ней - это право ? Я предполагаю, что сервер. * Функции выполняются на сервере. Если да, то он должен быть реорганизован на один звонок:

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

[<Rpc>] 
let SendBugCommand x = 
    CreateBug x 
    |> SendCommand 
+0

Хорошо удалил AsyncReplyChannel исправил проблему, спасибо. –

+0

Я понимаю, что намерение вводит в заблуждение ... Server.CreateBug - это не функция на стороне сервера, а тип объединения Server.Command.CreateBug. Я также подтвердил, что строительство было сделано на стороне клиента, так как нет никаких дополнительных рейсов туда и обратно. Я намерен предоставить клиенту возможность отправлять на сервер различные типы команд, которые я сериализую для сохранения истории и выполнения соответствующего кода. Я не понимаю бит о «Зачем посылать функцию-изоморфно ...» В каком виде вы вызываете метод на стороне сервера непосредственно лучше, чем отправка другой команды в одну точку входа? –

+1

Команды в порядке. Веселье начинается при отправке закладок. Меня смутило то, что вы можете закрыть закрытие в AsyncReplyChannel. В настоящее время WebSharper не разрешает отправлять блокировки по RPC в любом направлении, но в системе, которая это делает, мне все еще неясно, какова должна быть семантика и ее реализация. В любом случае, удачи в том, что вы делаете! – t0yv0

 Смежные вопросы

  • Нет связанных вопросов^_^