2017-02-09 5 views
0

Ist es möglich zu definieren, welche URL ein Service anstelle des Standards fabric:/AppName/ServiceName verwendet?Service Fabric Gibt die Fabric-URL an

Ich kann nicht finden, ob dies konfigurierbar ist oder nicht auf einer Anwendungsebene.

Antwort

0

Ja, können Sie den Namen des Dienstes in der etwas ApplicationManifest.xml zu anderen ändern, als der Name von den Klassennamen des Service gemacht.

Kurz: Ändern Sie einfach das name Attribut in ApplicationManifest.xml für diesen Dienst zu etwas anderem.

In Code: Wenn ich diesen Dienst:

public interface IJustAnotherStatelessService : IService 
{ 
    Task<string> SayHelloAsync(string someValue); 
} 

internal sealed class JustAnotherStatelessService : StatelessService, IJustAnotherStatelessService 
{ 
    // Service implementation 
} 

Registriert in Program.cs wie folgt aus:

ServiceRuntime.RegisterServiceAsync("JustAnotherStatelessServiceType", 
    context => new JustAnotherStatelessService(context)).GetAwaiter().GetResult(); 

Und im ServiceManifest.xml für diesen Dienst

<?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> 
... 

Im ApplicationManifest.xml Sie den vorgeschlagenen Namen erhalten:

<ApplicationManifest ...> 
    <DefaultServices> 
    <Service Name="JustAnotherStatelessService"> 
     <StatelessService ServiceTypeName="JustAnotherStatelessServiceType" InstanceCount="[JustAnotherStatelessService_InstanceCount]"> 
     <SingletonPartition /> 
     </StatelessService> 
    </Service> 
    </DefaultServices> 
</ApplicationManifest> 

Dies wird Ihnen ein Uri Ihnen Service wie

fabric:/app_name/JustAnotherStatelessService 

nun voran gehen und den Namen in der Anwendung manifestieren ändern:

<ApplicationManifest ...> 
    <DefaultServices> 
    <Service Name="AwesomeService"> 
     <StatelessService ServiceTypeName="JustAnotherStatelessServiceType" InstanceCount="[JustAnotherStatelessService_InstanceCount]"> 
     <SingletonPartition /> 
     </StatelessService> 
    </Service> 
    </DefaultServices> 
</ApplicationManifest> 

Und Ihr Service antwortet nun auf

fabric:/app_name/AwesomeService 
+0

Vielen Dank für die Antwort, ich glaube, ich war nicht klar mit meinen Anforderungen. Ich wollte wissen, ob Sie eine Anwendung auf 'Fabric:/foobarbazservice' hören können, aber ich denke nicht, dass dies möglich ist, da der Service-Resolver nach dem Servicetyp innerhalb des Anwendungstyps sucht und nicht zufällig einen auswählen kann ! – Mardoxx

+1

Nein, in diesem Teil haben Sie Recht, Sie sind auf das Schema {applicationName}/{serviceName_set_in_ApplicationManifest} für die URL beschränkt. Ich sehe keine Möglichkeit, vollständig benutzerdefinierte URLs zu setzen, da der Fabric-Transport seine URL intern erstellt. – yoape

0

können Sie diesen uri Builder verwenden (ServiceUriBuilder.cs) Klasse von hier: https://github.com/Azure-Samples/service-fabric-dotnet-web-reference-app/blob/master/ReferenceApp/Common/ServiceUriBuilder.cs

Für staatenlos Service können Sie bequem die Proxy erhalten:

var serviceUri = new ServiceUriBuilder(ServiceName); 
var proxyFactory = new ServiceProxyFactory(); 
var svc = proxyFactory.CreateServiceProxy<IServiceName>(serviceUri.ToUri()); 

Für Stateful-Service müssen Sie die Partition angeben .

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);