У меня есть несколько серверных объектов с иерархией наследования, например:
[<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)
Полагаю, есть проблемы с преобразованием объекта на стороне сервера в соответствующий клиентский аналог. Тем не менее я понятия не имею, как преодолеть это