C# 无法在服务结构中的一个ActorRuntime中注册两个参与者

C# 无法在服务结构中的一个ActorRuntime中注册两个参与者,c#,azure-service-fabric,C#,Azure Service Fabric,我有一个单一的服务结构演员服务。这将创建两个项目,ActorService和ActorService.Interfaces 接口包含根参与者的接口,称为IRootActor。ActorService本身包含RootActor和IChildActor,ChildActor。这两个接口都实现了IActor,两个类都继承了Actor,并实现了各自的接口。我在Program.cs中注册这些演员,如下所示: ActorRuntime.RegisterActorAsync<ChildActor>

我有一个单一的服务结构演员服务。这将创建两个项目,
ActorService
ActorService.Interfaces

接口包含根参与者的接口,称为
IRootActor
。ActorService本身包含
RootActor
IChildActor
ChildActor
。这两个接口都实现了
IActor
,两个类都继承了
Actor
,并实现了各自的接口。我在Program.cs中注册这些演员,如下所示:

ActorRuntime.RegisterActorAsync<ChildActor>(
   (context, actorType) => new ActorService(context, actorType, () => container.Resolve<ChildActor>()))
   .GetAwaiter()
   .GetResult();

ActorRuntime.RegisterActorAsync<RootActor>(
   (context, actorType) => new ActorService(context, actorType, () => container.Resolve<RootActor.Factory>()(context)))
   .GetAwaiter()
   .GetResult();

Thread.Sleep(Timeout.Infinite);
一切顺利。前面提到的
RootActor.Method
Method在一个循环中做两件事,创建子actor并调用其方法:

IChildActor proxy = ActorProxy.Create<IChildActor>(new ActorId(otherId), sameActorServiceUri);
proxy.OtherMethod(transformedData);
IChildActor proxy=ActorProxy.Create(新ActorId(otherId),sameActorServiceUri);
其他方法(转换数据);
问题来了。调用
proxy.OtherMethod
时,基本上会出现以下异常:

HResult=-2146232969 Message=未找到接口的MethodDispatcher id“230348154”源=Microsoft.ServiceFabric.Actors


我做错什么了吗?考虑到这一点,我认为可以从一个服务中创建两个演员…

好的,我想出来了。对于任何挣扎的人来说,问题在于actor服务URI。 我错误地认为两个参与者共享服务URI。正如在中提到的,演员实际上是分开主持的。如果您查看一下
ServiceManifest.xml
,您会发现两个
扩展
xml节点,它们都被命名为
\uu生成的服务类型
。只需根据child
DefaultService
xml节点更改服务名称部分,因此在本例中很可能是
ChildActorService
。天哪,听起来很不合适


总而言之,服务结构中任何内容的设置和配置都相当复杂。然而,VS会尽力帮助你。有时你甚至没有预料到这一点,而这本质上是邪恶的根源所在。如果您不知道要查找什么,您将不会查找它。

参与者注册良好,使用ActorProxy连接到他们时,如果您要指定服务名称,则需要指定正确的服务名称。您可以省略服务名称,改为指定applicationName,Actor框架将为Actor计算出正确的服务名称。请看

关于计算名称的评论是否不准确?您发布的链接提到该名称是从actor实现的接口派生的,但无法在actor实现更多接口时推断出来。。。
IChildActor proxy = ActorProxy.Create<IChildActor>(new ActorId(otherId), sameActorServiceUri);
proxy.OtherMethod(transformedData);