На моем локальном компьютере в 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: Невозможно привести COM-объект типа 'System .__ ComObject' к интерфейсу.введите 'IFabricTestManagementClient4'. Эта операция завершилась неудачно, поскольку не удалось выполнить вызов QueryInterface для компонента COM для интерфейса с IID '{B96AA7D4-ACC0-4814-89DC-561B0CBB6028}' из-за следующей ошибки: такой интерфейс не поддерживается (Исключение из HRESULT:0x80004002 (E_NOINTERFACE)). ", хотя фабрика именованных приложений: / SFAccountUpTest / Stateless1, кажется, запущена и работает.
Я полагаю, проблема в том, что вызовы RPC только что сделаны для вызова служб внутри кластеров SF,не снаружи.Можно ли сделать вызов RPC вне кластера или необходимо создать какой-либо веб-API для вызова службы?