WebSharper: возвращаемый Rpc объект непригоден для клиента или вызывает ошибку

У меня есть несколько серверных объектов с иерархией наследования, например:

[<JavaScriptExport>]
type [<AbstractClass>] A() = ...

[<JavaScriptExport>]
type [<AbstractClass>] B() =
    inherit A()

[<JavaScriptExport>]
type C() =
    inherit B()

Вышеупомянутые объекты имеют определенные поля и методы, которые я опустил для краткости. Все они могут быть скомпилированы в javascript - я не получаю ошибок сборки.

У меня есть RPC, который возвращает экземпляр такого объекта, созданный на стороне сервера:

module Remoting =
    [<Rpc>]
    let GetObject (arg: string) : Async<A> =
        async {
            return (upcast C() : A)
        }

Когда я вызываю rpc и отлаживаю соответствующий javascript в своем браузере, я вижу, что возвращенный объект — это {}. Я не вижу никаких ошибок на стороне сервера в журналах.

Если я изменяю подпись Rpc на конкретный тип GetObject (arg: string) : Async<C>, я получаю сообщение об ошибке на сервере:

System.Exception: Не удалось загрузить метод (GetObject: System.String -> Microsoft.FSharp.Control.FSharpAsync`1‹C›) кандидаты: [|"(GetObject: System.String -> Microsoft.FSharp.Control.FSharpAsync` 1‹.C›)"|]

Кажется, что он ищет тип .C вместо типа C (акцент на ведущей точке)

В чем причина такого поведения? Есть ли способ получить экземпляр моего объекта с сервера без указания его конкретного типа?


Обновлять

Интересно, что это сработает, если я заменю вызов RPC клиентским методом следующим образом:

[<JavaScript>]
let GetObjectClient (arg : string) : A =
    (upcast C() : A)

Я предполагаю, что есть проблемы с преобразованием объекта на стороне сервера в соответствующий клиентский аналог. Тем не менее я понятия не имею, как преодолеть это


person Ivaylo Slavov    schedule 05.01.2019    source источник
comment
Ограничение вызовов RPC касается того, что можно сериализовать через json. Объекты с наследованием могут быть слишком сложными для взаимодействия с RPC. Думайте больше о передаче информации и меньше о сложных структурах с методами или функциями,   -  person AMieres    schedule 06.01.2019
comment
@AMieres, увы, все так, как ты говоришь. Я надеялся, что объекты с конструктором по умолчанию будут распознаны и повторно созданы на клиенте, но безрезультатно. Я задал еще один вопрос, который, как мне кажется, лучше описывает мой случай. Я планирую удалить это через день   -  person Ivaylo Slavov    schedule 09.01.2019