在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来进行服务调用?
答案 0 :(得分:2)
只要您在同一网络上,就可以使用其他应用程序中的SF Remoting来调用服务和参与者。例如,请参见this demo项目,其目的是为了进行测试。
确保使用相同的DLL来保存客户端和服务项目中的接口定义。 (它的工作方式不同于WCF,后者可以通过使用wsdl来独立于服务生成代理。)
答案 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
{
...