Я создал приложение Service Fabric .NET Core без сохранения состояния (v 3.0.467). Мне нужно использовать как KestrelCommunicationListener, так и удаленный вызов ServiceProxy для этой службы.
При развертывании приложения в локальном кластере возникает исключение:
Уникальное имя должно быть указано для каждого слушателя, когда используется несколько слушателей связи
Я настроил как показано ниже в файле servicemanifest.xml
<Resources>
<Endpoints>
<!-- This endpoint is used by the communication listener to obtain the port on which to
listen. Please note that if your service is partitioned, this port is shared with
replicas of different partitions that are placed in your code. -->
<Endpoint Name="ServiceEndpointV2" />
<Endpoint Protocol="http" Name="httpServiceEndpoint" Type="Input" Port="9098" />
</Endpoints>
</Resources>
и пример кода:
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[]
{
new ServiceInstanceListener((context) =>
{
// return new FabricTransportServiceRemotingListener(context, this);
return new FabricTransportServiceRemotingListener(context, this,new Microsoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime.FabricTransportRemotingListenerSettings(){EndpointResourceName = "ServiceEndpointV2" });
}),
new ServiceInstanceListener(serviceContext =>
new KestrelCommunicationListener(serviceContext, "httpServiceEndpoint", (url, listener) =>
{
ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");
return new WebHostBuilder()
.UseKestrel()
.ConfigureServices(
services => services
.AddSingleton<StatelessServiceContext>(serviceContext))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseUrls(url)
.Build();
}))
};
}
Есть ли ошибка в этой конфигурации?
Обновление:
Ниже приведен код примера вызова службы из клиента:
public Task<string> OnRouteMessageaAsync(string tenant)
{
return Task.FromResult(tenant);
}
Код клиента:
private async Task<string> RemoteServiceCall()
{
try
{
var client = ServiceProxy.Create<ICommunication>(new Uri("fabric:/AuthenticationServiceApp/AuthenticationServiceApi"), listenerName: "RemotingListener");
var response = client.OnRouteMessageaAsync("tenant");
return response.Result;
}
catch (Exception ex)
{
}
return null;
}
Пример кода приведен в следующей ссылке на GitHub:
serviceappcode