我是否可以从群集外部但在同一本地网络中使用RPC调用无状态服务?

问题描述 投票:1回答:1

在Visual Studio 2017中的本地计算机上,我基于.NET Core Stateless Service模板创建了解决方案,并添加了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'。此操作失败,因为QueryInterface调用COM组件上的IID为{{由于以下错误,B96AA7D4-ACC0-4814-89DC-561B0CBB6028}'失败:没有支持这样的接口(HRESULT异常:0x80004002(E_NOINTERFACE))。“,虽然命名应用程序结构:/ SFAccountUpTest / Stateless1似乎已启动并运行。

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

solution structure

azure-service-fabric azure-cloud-services
1个回答
2
投票

只要您在同一网络上,就可以使用其他应用程序中的SF Remot来呼叫服务和演员。例如,请参阅this demo项目,该项目用于测试目的。

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

也许你遇到了一个问题,比如this one或this

© www.soinside.com 2019 - 2024. All rights reserved.