服务结构服务远程处理

在过去的几周里,我一直在从云服务迁移到Service Fabric,并且使用两种服务之间的Remoting遇到了一些绊脚石。

我一直在使用Service Remoting上的官方文档和示例代码,特别是我试图让这里概述的示例工作:

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-services-communication-remoting

我有2项服务。 一个名为“RemoteService” ,另一个名为“CallerService” 。 两者都源自默认的无状态服务项目。

“RemoteService”“CallerService”项目中,我添加了以下接口来描述它们之间的服务契约:

public interface IMyService : IService { Task HelloNameAsync(string name); } 

“RemoteService”中,我在RemoteService类中创建了相关联的方法

 public Task HelloNameAsync(string name) { return Task.FromResult("Hello " + name + "!"); } 

我还使用以下内容覆盖CreateServiceInstanceListeners

 protected override IEnumerable CreateServiceInstanceListeners() { return new[] { new ServiceInstanceListener(context => this.CreateServiceRemotingListener(context)) }; } 

在我的“CallerService”中,当我尝试连接时,使用以下内容调用“RemoteService”:

 IMyService helloNameClient = ServiceProxy.Create(new Uri("fabric:/Application/RemoteService")); string message = await helloNameClient.HelloNameAsync("Luke"); 

我得到了这个例外

 InnerException = {"Interface id '1994370306' is not implemented by object 'RemoteService.RemoteService'"} 

我用细齿梳子检查了这个样品,并确信我应该有一切到位。 我已经阅读过有关设置端点和将服务注册到服务目录的内容,但据我所知,这些内容适用于外部服务,Remoting文档没有提到需要这样做。

更新:

以下是RemoteService类的声明方式:

 internal sealed class RemoteService : StatelessService, IMyService 

更新2

以下是这两种服务的Settings.xml的外观。 这些是项目开箱即用的默认设置。 我没有添加或删除任何内容。 我还要注意,我正在本地服务结构上运行所有这些。

    <!-- 
-->

声明服务接口的程序集需要与客户端共享,不能在客户端重新创建相同的接口。 当Service Fabric建立通信时,它会构建一个接口映射,它的方法来自服务使用的实际程序集。

根据您的描述,您似乎在服务和客户端项目中声明了相同的界面? 如果是这样,那么这就是修复。

从SO:从群集中的其他应用程序调用服务 :唯一棘手的部分是如何从外部服务到您的呼叫服务获得接口? 您可以简单地引用要调用的服务的内置.exe,或者可以将包含接口的程序集打包为NuGet包并放入私有源。

如果您不这样做而只是在Visual Studio解决方案之间共享代码,Service Fabric会认为这些是两个不同的接口,即使它们共享完全相同的签名。 如果您为服务执行此操作,则会收到NotImplementedException,说“接口ID'{xxxxxxxx}’未由对象'{service}’”实现,如果您为Actor执行此操作,则会收到KeyNotfoundException,指出“找不到MethodDispatcher” interface id’ – {xxxxxxxxxx}’“。

因此,要解决您的问题,请确保引用要在正在调用的外部应用程序中调用的应用程序中的同一程序集。