Метод ServiceFabric StatefulService передал ошибку прокси-сервера актора DataContract

У меня есть StatefulService с методом. Первый аргумент метода принимает тип интерфейса, который соответствует одному из моих Актеров. Актер вызывает метод службы, используя ServiceProxy, передавая this в качестве первого аргумента. Это компилирует файл. Подписи совпадают.

Однако при запуске я получаю сообщение об ошибке о неожиданном типе IMyActorType, который не известен DataContractSerializer. Я знаю, что означает это сообщение. ServiceProxy не справляется с ActorReferences? Я знаю, что ActorProxy работает. Я могу передать одного Актера другому Актеру, используя ActorProxy.

Или это может быть какая-то проблема в моей конфигурации StatefulService? Что-то с моей настройкой ServiceReplicaListener?

На данный момент я обошел эту проблему, изменив сигнатуры моих методов StatefulService на ActorReference. Это нормально сериализуется, и я могу распаковать его с другой стороны. Однако я бы предпочел правильно напечатать.


person Jerome Haltom    schedule 30.11.2015    source источник


Ответы (2)


Прокси-служба не обрабатывает ссылки на акторов, как это делает прокси-сервер. Стек служб не зависит от субъекта и не знает ссылок на субъект. Вместо передачи интерфейса субъекта можно передать ссылку на субъект (https://msdn.microsoft.com/en-us/library/azure/microsoft.servicefabric.actors.actorreference.get.aspx), а затем привязать (https://msdn.microsoft.com/en-us/library/azure/microsoft.servicefabric.actors.actorreference.bind.aspx) ссылка субъекта на тип интерфейса субъекта на принимающей стороне. Вы можете преобразовать выходные данные метода привязки в интерфейс актора.

person VipulM-MSFT    schedule 02.12.2015
comment
Спасибо тебе за это. Я понял это в своей голове после пары часов размышлений, как это можно было построить? - person Jerome Haltom; 04.12.2015

Вам нужно передать простой POCO, оформленный DataContract, а не интерфейс. DataContractSerializer не будет работать на интерфейсе. Те же правила, что и для WCF, применяются и к Service Fabric.

person Jim    schedule 01.12.2015
comment
Однако я могу передавать интерфейсы с помощью ActorProxy, как уже упоминалось. Например: var p = ActorProxy.Create<IRemoteActor>(id); await p.Invoke(this); - person Jerome Haltom; 01.12.2015