2017-10-11 8 views
2

J'ai un service sans état Asp.net Core 2.0 et un service avec état avec Asp.net Core 2.0 sur Service Fabric 6 avec un compte de 10 partitions.Le client tente de se connecter à une adresse non valide sur Service Fabric ServiceProxy

J'ai suivi ce tutoriel

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-add-a-web-frontend

J'ai suivi toutes les étapes sauf que je les modèles dans Visual Studio où CreateServiceReplicaListeners utilise-t-KestrelCommunicationListener

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() 
    { 
     return new ServiceReplicaListener[] 
     { 
      new ServiceReplicaListener(serviceContext => 
       new KestrelCommunicationListener(serviceContext, (url, listener) => 
       { 
        return new WebHostBuilder() 
           .UseKestrel() 
           .ConfigureServices(
            services => services 
             .AddSingleton<StatefulServiceContext>(serviceContext) 
             .AddSingleton<IReliableStateManager>(this.StateManager)) 
           .UseContentRoot(Directory.GetCurrentDirectory()) 
           .UseStartup<Startup>() 
           .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl) 
           .UseUrls(url) 
           .Build(); 
       })) 
     }; 
    } 

Quand j'appelle mon service dans la Asp.net Core 2.0 Service sans état utilisant ce code:

var service = ServiceProxy.Create<IStorageService>(new Uri("fabric:/MyCluster/Storage"), new ServicePartitionKey(Fnv1aHashCode.Get64bitHashCode(User.Id))); 
await service.MyMethod(); 

Une exception est levée lors de l'appel "MyMethod"

client tente de se connecter à l'adresse invalide http://localhost:58352/etc ..

L'URL présente dans l'exception est présent dans le service Fabric Explorer, et Port et PartitionKey est correct. Aucun point d'extrémité n'est défini dans le ServiceManifest, car le service Stateful est essentiellement le modèle avec l'ajout d'une interface IService et de la méthode MyMethod, conformément au didacticiel ci-dessus.

Qu'est-ce qui me manque ici? La documentation n'est pas à jour pour Asp.net Core 2.0.

J'ai essayé de ne pas utiliser les partitions, en réglant ServicePartitionKey(0) mais le même résultat.

Je ne sais pas comment procéder.

Répondre

4

Vous mélangez deux piles de communication complètement différentes:

Vous ne pouvez pas mélanger les deux. Vous devez utiliser un client HTTP pour parler aux points de terminaison HTTP de votre service. Il y a un HTTP reverse proxy dans Service Fabric qui effectuera la découverte du service et demandera le transfert pour que vous puissiez le rendre plus facile. Il existe également un DNS service qui vous permet d'adresser d'autres services en utilisant des noms DNS simples.

Dans le tutoriel, vous faites référence, le service back-end utilise un service d'écoute Remoting qui expose un point de terminaison RPC pour ServiceProxy de se connecter à:

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() 
{ 
    return new List<ServiceReplicaListener>() 
    { 
     new ServiceReplicaListener(
      (context) => 
       this.CreateServiceRemotingListener(context)) 
    }; 
} 
+0

Merci, je confondais les deux piles. Pourriez-vous partager du code ou des documents sur la façon d'appeler le point de terminaison exposé à l'aide du point de terminaison HTTP exposé par KestrelCommunicationListener? –