Можно ли определить, какой URL-адрес использует служба вместо стандартного fabric:/AppName/ServiceName
?Сервис Ткань указать тканевый url
Я не могу найти, если это настраивается или нет на уровне приложения.
Можно ли определить, какой URL-адрес использует служба вместо стандартного fabric:/AppName/ServiceName
?Сервис Ткань указать тканевый url
Я не могу найти, если это настраивается или нет на уровне приложения.
Да, вы можете изменить имя сервиса в ApplicationManifest.xml
на что-то другое, чем имя, взятое из имени класса службы.
Короткие: просто измените атрибут name
в ApplicationManifest.xml
для этого сервиса на что-то еще.
В коде: Если у меня есть этот сервис:
public interface IJustAnotherStatelessService : IService
{
Task<string> SayHelloAsync(string someValue);
}
internal sealed class JustAnotherStatelessService : StatelessService, IJustAnotherStatelessService
{
// Service implementation
}
На учете в Program.cs
так:
ServiceRuntime.RegisterServiceAsync("JustAnotherStatelessServiceType",
context => new JustAnotherStatelessService(context)).GetAwaiter().GetResult();
И в ServiceManifest.xml
для этой службы
<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest ...>
<ServiceTypes>
<!-- This is the name of your ServiceType.
This name must match the string used in RegisterServiceType call in Program.cs. -->
<StatelessServiceType ServiceTypeName="JustAnotherStatelessServiceType" />
</ServiceTypes>
...
В ApplicationManifest.xml
вы получите предложенное имя:
<ApplicationManifest ...>
<DefaultServices>
<Service Name="JustAnotherStatelessService">
<StatelessService ServiceTypeName="JustAnotherStatelessServiceType" InstanceCount="[JustAnotherStatelessService_InstanceCount]">
<SingletonPartition />
</StatelessService>
</Service>
</DefaultServices>
</ApplicationManifest>
Это даст вам Ури вам обслуживание как
fabric:/app_name/JustAnotherStatelessService
Теперь, идти вперед и изменить имя в манифесте приложения:
<ApplicationManifest ...>
<DefaultServices>
<Service Name="AwesomeService">
<StatelessService ServiceTypeName="JustAnotherStatelessServiceType" InstanceCount="[JustAnotherStatelessService_InstanceCount]">
<SingletonPartition />
</StatelessService>
</Service>
</DefaultServices>
</ApplicationManifest>
И ваша служба в настоящее время отвечает на
fabric:/app_name/AwesomeService
Вы можете использовать этот Uri строитель (ServiceUriBuilder.cs) класс здесь: https://github.com/Azure-Samples/service-fabric-dotnet-web-reference-app/blob/master/ReferenceApp/Common/ServiceUriBuilder.cs
для лиц без обслуживания вы можете легко получить прокси:
var serviceUri = new ServiceUriBuilder(ServiceName);
var proxyFactory = new ServiceProxyFactory();
var svc = proxyFactory.CreateServiceProxy<IServiceName>(serviceUri.ToUri());
Для сохранения состояния сервиса вы должны указать раздел ,
var serviceUri = new ServiceUriBuilder(StatefulServiceName);
var proxyFactory = new ServiceProxyFactory();
//this is just a sample of partition 1 if you are using number partitioning.
var partition = new ServicePartitionKey(1);
var svc = proxyFactory.CreateServiceProxy<IStatefulServiceName>(serviceUri.ToUri(), partition);
Благодарим вас за ответ, я считаю, что я не совсем понял свои требования. Я хотел знать, можете ли вы заставить приложение прослушивать 'fabric:/foobarbazservice', но я не думаю, что это возможно, поскольку служебный resolver ищет тип службы внутри типа приложения и не может, скажем, выбрать один случайным образом ! – Mardoxx
Нет, в этой части вы правы, вы ограничены схемой {applicationName}/{serviceName_set_in_ApplicationManifest} для URL-адреса. Я не вижу никакого способа установить полностью настраиваемые URL-адреса, учитывая, как транспортный механизм создает свой Url internaly. – yoape