WebSharper: Rpc-возвращаемый объект не может быть использован на клиенте или вызывает ошибку - PullRequest
0 голосов
/ 05 января 2019

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

[<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 ) кандидатов: [| "(GetObject: System.String -> Microsoft.FSharp.Control .FSharpAsync`1 <.C>) "|]

Кажется, что он ищет тип .C вместо типа C (подчеркивает начальную точку)

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


Обновление

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

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

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

...