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

时间:2018-09-07 21:20:25

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

在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'。此操作失败,因为对COM组件的QueryInterface调用具有IID'{B96AA7D4-ACC0-4814-89DC-561B0CBB6028}'的接口由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE))。“ , 尽管命名为Application fabric:/ SFAccountUpTest / Stateless1似乎已启动并正在运行。

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

solution structure

2 个答案:

答案 0 :(得分:2)

只要您在同一网络上,就可以使用其他应用程序中的SF Remoting来调用服务和参与者。例如,请参见this demo项目,其目的是为了进行测试。

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

也许您遇到了一个问题,例如thisthis一个。

答案 1 :(得分:1)

我意识到这个问题有点老了,但是解决此问题的方法是确保使用的是“ V2”远程处理堆栈(details here

基本上,您需要编辑ServiceManifest.xml才能将其用作端点:

<Resources>
  <Endpoints>
    <Endpoint Name="ServiceEndpointV2" />  
  </Endpoints>
</Resources>

并将[assembly]属性添加到您的远程处理界面(在namespace之上)。

示例:

...
using Microsoft.ServiceFabric.Services.Remoting;
using Microsoft.ServiceFabric.Services.Remoting.FabricTransport;

[assembly: FabricTransportServiceRemotingProvider(RemotingListenerVersion = RemotingListenerVersion.V2, RemotingClientVersion = RemotingClientVersion.V2)]
namespace ClassLibrary1
{
    public interface IMyService : IService
    {
        ...