【问题标题】:Service Fabric Service RemotingService Fabric 服务远程处理
【发布时间】:2017-07-26 17:02:26
【问题描述】:

过去几周我一直在从云服务迁移到 Service Fabric,并且在使用 2 个服务之间的远程处理时遇到了一些障碍。

我一直在使用有关远程服务的官方文档和示例代码,特别是我试图让此处概述的示例正常工作:

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);
}

"RemoteService" 我在 RemoteService 类中创建了关联方法

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

我还使用以下内容覆盖 CreateServiceInstanceListeners

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

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

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

我得到了这个异常

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

我已经用细齿梳仔细检查了这个样品,并且确信我已经将所有东西都准备好了。我已经阅读了有关设置端点并将您的服务注册到服务目录中的信息,但据我了解,这些是针对外部服务的,并且远程处理文档没有提到需要这样做。

更新:

RemoteService 类的声明方式如下:

internal sealed class RemoteService : StatelessService, IMyService

更新 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>

【问题讨论】:

  • 我们可以看看你是如何声明 RemoteService 类的吗?两种服务的 Settings.xml 也是如此。
  • 是的,我刚刚添加了更新。
  • 刚刚也添加了 Settings.xml 文件。

标签: c# azure azure-service-fabric


【解决方案1】:

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

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

来自SO: Calling services from other application in the cluster: 唯一棘手的部分是如何从外部服务获取接口到调用服务?您可以简单地为要调用的服务引用构建的 .exe,也可以将包含接口的程序集打包为 NuGet 包并放在私有源上。

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

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

【讨论】:

  • 谢谢!由于这两个服务都在同一个解决方案中,我为接口创建了一个共享库。
猜你喜欢
  • 2018-03-26
  • 2017-09-17
  • 2018-08-17
  • 2019-04-05
  • 2017-09-18
  • 2018-05-07
  • 2018-12-06
  • 1970-01-01
  • 2021-02-15
相关资源
最近更新 更多