首页 > 解决方案 > 我可以从集群外部但在同一个本地网络中使用 RPC 调用无状态服务吗?

问题描述

在我的本地机器上的 Visual Studio 2017 中,我创建了基于 .NET Core 无状态服务模板的解决方案,并添加了 Microsoft.ServiceFabric.Services.Remoting.Runtime 包以通过 RPC 接受远程调用。

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    return this.CreateServiceRemotingInstanceListeners();
}

然后我在一个单独的项目中添加了接口 ITestAccUp:

public interface ITestAccUp : IService
{
    Task NotifyAsync();
}

我将接口的实现添加到无状态服务中,并创建了另一个项目,即 .NET Core 控制台客户端来运行该服务。控制台将在集群外运行。

static void Main(string[] args)
{
    ITestAccUp testAccUpClient = ServiceProxy.Create<ITestAccUp>(new Uri("fabric:/SFAccountUpTest/Stateless1"));

    testAccUpClient.NotifyAsync().Wait();
}

但是,当我运行它时,我收到错误“InvalidCastException:无法将类型为“System.__ComObject”的 COM 对象转换为接口类型“IFabricTestManagementClient4”。此操作失败,因为对具有 IID 的接口的 COM 组件调用 QueryInterface '{ B96AA7D4-ACC0-4814-89DC-561B0CBB6028}' 由于以下错误而失败:不支持此类接口(HRESULT 异常:0x80004002 (E_NOINTERFACE))。” ,尽管 Named Application fabric:/SFAccountUpTest/Stateless1 似乎已启动并正在运行。

我想问题是 RPC 调用只是为了调用 SF 集群内部的服务,而不是外部。是否可以在集群外部进行 RPC 调用,或者是否需要构建某种 Web API 来进行服务调用?

解决方案结构

标签: azure-service-fabricazure-cloud-services

解决方案


只要您在同一个网络上,您就可以使用 SF Remoting 从其他应用程序调用服务和参与者。例如,请参阅此演示项目,该项目出于测试目的这样做。

确保使用相同的 DLL 来保存来自客户端和服务项目的接口定义。(它的工作方式与 WCF 不同,后者可以通过使用 wsdl 独立于服务生成代理。)

也许你遇到了一个问题,比如这个,或者这个


推荐阅读