服务结构服务远程处理

INN*_*VTV 3 c# azure azure-service-fabric

在过去的几周里,我一直在从云服务迁移到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<string> HelloNameAsync(string name);
}
Run Code Online (Sandbox Code Playgroud)

"RemoteService"中,我在RemoteService类中创建了asociated方法

public Task<string> HelloNameAsync(string name)
{
    return Task.FromResult("Hello " + name + "!");
}
Run Code Online (Sandbox Code Playgroud)

我还使用以下内容覆盖CreateServiceInstanceListeners

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    return new[] { new ServiceInstanceListener(context => this.CreateServiceRemotingListener(context)) };
}
Run Code Online (Sandbox Code Playgroud)

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

IMyService helloNameClient = ServiceProxy.Create<IMyService>(new Uri("fabric:/Application/RemoteService"));
string message = await helloNameClient.HelloNameAsync("Luke");
Run Code Online (Sandbox Code Playgroud)

我得到了这个例外

InnerException = {"Interface id '1994370306' is not implemented by object 'RemoteService.RemoteService'"}
Run Code Online (Sandbox Code Playgroud)

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

更新:

以下是RemoteService类的声明方式:

internal sealed class RemoteService : StatelessService, IMyService
Run Code Online (Sandbox Code Playgroud)

更新2

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

<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <!-- Add your custom configuration sections and parameters here -->
  <!--
  <Section Name="MyConfigSection">
    <Parameter Name="MyParameter" Value="Value1" />
  </Section>
  -->
</Settings>
Run Code Online (Sandbox Code Playgroud)

yoa*_*ape 5

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

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

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

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

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