web-dev-qa-db-fra.com

charge le service WCF par environnement dans le projet principal .net

J'ai un problème lors de l'ajout de WCF dans le projet principal .NET . Lorsque j'utilisais auparavant .net, je pouvais ajouter plusieurs environnements dans web.config afin de pouvoir charger le service Web approprié à l'exécution (Dev, Rec, Prod) .

Le problème rencontré dans le projet principal .net lorsque j'ai ajouté une référence de mon service WCF en tant que service connecté, il créait un fichier ConnectedService.json contenant une URL pour le service WCF.

{
  "ProviderId": "Microsoft.VisualStudio.ConnectedService.Wcf",
  "Version": "15.0.20406.879",
  "GettingStartedDocument": {
    "Uri": "https://go.Microsoft.com/fwlink/?linkid=858517"
  },
  "ExtendedData": {
    "Uri": "*****?singleWsdl",
    "Namespace": "Transverse.TokenService",
    "SelectedAccessLevelForGeneratedClass": "Public",
    "GenerateMessageContract": false,
    "ReuseTypesinReferencedAssemblies": true,
    "ReuseTypesinAllReferencedAssemblies": true,
    "CollectionTypeReference": {
      "Item1": "System.Collections.Generic.List`1",
      "Item2": "System.Collections.dll"
    },
    "DictionaryCollectionTypeReference": {
      "Item1": "System.Collections.Generic.Dictionary`2",
      "Item2": "System.Collections.dll"
    },
    "CheckedReferencedAssemblies": [],
    "InstanceId": null,
    "Name": "Transverse.TokenService",
    "Metadata": {}
  }
}

Ma question, comment puis-je charger le bon service en fonction de l'environnement utilisé.

Remarque.

Dans mon projet, je n'avais ni appsettings ni web config. Il s’agit d’une bibliothèque de classes .net principale appelée dans l’application principale ASP.NET en tant que middleware.

5
Adouani Riadh

Pour qui est intéressé par la solution J'ai ajouté un point de terminaison pour mon service dans chaque application. {Environment} .json et dans la classe de service, j'injecte une nouvelle instance de mon service basée sur la variable d'environnement ASPNETCORE_ENVIRONMENT

   services.AddTransient<Transverse.TokenService.ITokenService>(provider =>
        {
            var client = new Transverse.TokenService.TokenServiceClient();
            client.Endpoint.Address = new System.ServiceModel.EndpointAddress(Configuration["Services:TokenService"]);
            return client;
        });

Peut-être n'est pas le meilleur mais cela fonctionne bien.

3
Adouani Riadh

D'après ce que j'ai compris de cet article , voici la recommandation de Microsoft:

  1. Ajouter un nouveau fichier de classe
  2. Ajouter le même espace de nom de service reference.cs
  3. Ajouter une classe partielle pour développer la classe de service de référence (déclarée dans Reference.cs)
  4. And Méthode partielle pour implémenter ConfigureEndpoint () (déclaré dans Reference.cs)
  5. Implémentez la méthode ConfigureEndpoint() en définissant une nouvelle valeur pour le point de terminaison 

Exemple:

namespace Your_Reference_Service_Namespace
{
    public partial class Your_Reference_Service_Client
    {
        static partial void ConfigureEndpoint(System.ServiceModel.Description.ServiceEndpoint serviceEndpoint, System.ServiceModel.Description.ClientCredentials clientCredentials)
        {
            serviceEndpoint.Address = 
                new System.ServiceModel.EndpointAddress(new System.Uri("http://your_web_service_address"), 
                new System.ServiceModel.DnsEndpointIdentity(""));
        }
    }
}
  1. Ici, vous pouvez prendre la valeur du fichier appsettings.json

    new System.Uri (configuration.GetValue ("yourServiceAddress")

0
Refael

Utilisez une ChannelFactory pour consommer votre service . WCF ChannelFactory vs générateur de proxy

Une ChannelFactory vous permet de définir une EndpointAddress. Comment: utiliser ChannelFactory

L'URL du noeud final peut être chargée à partir d'un fichier de configuration. Dans une configuration plus avancée, une recherche de répertoire pour le service peut être effectuée pour récupérer l'URL de l'environnement dans lequel l'application est déployée. https://en.wikipedia.org/wiki/Service_provider_interface

https://github.com/jolmari/netcore-wcf-service-proxy

Exemple d'utilisation de plusieurs services WCF à l'aide d'un proxy implémentation dans une application Web ASP.NET Core.

0
ofthelit