Comment changer dynamicment les adresses de service Web dans .NET sans recompilation?

J’ai un code qui fait référence à un service Web et j’aimerais que l’adresse de ce service Web soit dynamic (à partir d’une firebase database, d’un fichier de configuration, etc.) afin de pouvoir facilement la modifier. Une des utilisations principales de cette solution consistera à déployer dans plusieurs environnements où les noms de machine et les adresses IP sont différents. La signature du service Web sera la même pour tous les déploiements, juste ailleurs.

Peut-être que je viens d’être gâté par l’assistant Visual Studio “Ajouter une référence Web” – il semble que cela devrait être quelque chose de relativement facile, cependant.

Lorsque vous générez une référence Web et cliquez sur la référence Web dans l’Explorateur de solutions. Dans le volet des propriétés, vous devriez voir quelque chose comme ceci:

Propriétés de référence Web

Changer la valeur en dynamic mettra une entrée dans votre app.config.

Voici l’ article CodePlex qui contient plus d’informations.

Si vous définissez ce paramètre de manière dynamic, vous devez définir le champ d’instance .Url de la classe proxy que vous appelez.

Définir la valeur dans le fichier .config à partir de votre programme:

  1. Est un désordre

  2. Peut ne pas être lu avant le prochain démarrage de l’application.

Si ce n’est que quelque chose qui doit être fait une fois par installation, je serais d’accord avec les autres affiches et utiliserais le fichier .config et le paramètre dynamic.

Je sais que c’est une vieille question, mais notre solution est beaucoup plus simple que ce que je vois ici. Nous l’utilisons pour les appels WCF avec VS2010 et plus. L’URL de chaîne peut provenir de parameters d’application ou d’une autre source. Dans mon cas, il s’agit d’une liste déroulante où l’utilisateur choisit le serveur. TheService a été configuré via la référence de service d’ajout de VS.

 private void CallTheService( ssortingng url ) { TheService.TheServiceClient client = new TheService.TheServiceClient(); client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url); var results = client.AMethodFromTheService(); } 

J’ai lutté avec ce problème pendant quelques jours et finalement l’ampoule a cliqué. La clé pour pouvoir modifier l’URL d’un service Web au moment de l’exécution remplace le constructeur, ce que j’ai fait avec une déclaration de classe partielle. Le paramètre ci-dessus, définissant le comportement de l’URL sur Dynamique doit également être effectué.

Cela crée essentiellement un wrapper de service Web où, si vous devez recharger le service Web à un moment donné, via l’ajout d’une référence de service, vous ne perdez pas votre travail. L’aide de Microsoft pour les classes partielles indique en particulier qu’une partie de la raison de cette construction est de créer des wrappers de service Web. http://msdn.microsoft.com/en-us/library/wa80x488(v=vs.100).aspx

 // Web Service Wrapper to override constructor to use custom ConfigSection // app.config values for URL/User/Pass namespace myprogram.webservice { public partial class MyWebService { public MyWebService(ssortingng szURL) { this.Url = szURL; if ((this.IsLocalFileSystemWebService(this.Url) == true)) { this.UseDefaultCredentials = true; this.useDefaultCredentialsSetExplicitly = false; } else { this.useDefaultCredentialsSetExplicitly = true; } } } } 

Modifier le comportement de l’URL à ” Dynamique “.

Tant que les méthodes de service Web et les classes exposées sous-jacentes ne changent pas, c’est assez sortingvial. Avec Visual Studio 2005 (et versions ultérieures), l’ajout d’une référence Web crée une section app.config (ou web.config, pour les applications Web) contenant cette URL. Tout ce que vous avez à faire est de modifier le fichier app.config pour refléter l’URL souhaitée.

Dans notre projet, notre approche simple consistait simplement à commenter les entrées app.config par type d’environnement (développement, test, production). Nous avons donc simplement décommenté l’entrée pour le type d’environnement souhaité. Aucun codage spécial n’est nécessaire.

Juste une note sur la différence entre statique et dynamic.

  • Statique : vous devez définir la propriété URL chaque fois que vous appelez un service Web. Ceci parce que l’URL de base si le service Web est dans le constructeur de la classe proxy.
  • Dynamique : une clé de configuration spéciale sera créée pour vous dans votre fichier web.config . Par défaut, la classe proxy lit l’URL de cette clé.

Si vous récupérez l’URL d’une firebase database, vous pouvez l’atsortingbuer manuellement à la propriété URL de la classe proxy du service Web. Cela devrait être fait avant d’appeler la méthode Web.

Si vous souhaitez utiliser le fichier de configuration, vous pouvez définir le comportement de l’URL des classes proxy sur dynamic.

Bien sûr, la propriété Url est la voie à suivre. Que ce soit pour le définir dans app.config, la firebase database ou un troisième emplacement dépend en quelque sorte de vos besoins de configuration. Parfois, vous ne voulez pas que l’application redémarre lorsque vous modifiez l’emplacement du service Web. Il se peut que vous n’ayez pas d’équilibreur de charge à la hauteur du backend. Il se peut que vous corrigiez un bogue de service Web. Votre implémentation peut également avoir des problèmes de configuration de sécurité. Que ce soit les noms d’utilisateur et les mots de passe de la firebase database de production ou même les informations d’authentification de sécurité de ws. La séparation appropriée des tâches peut vous amener à des configurations de configuration plus complexes.

Si vous ajoutez une classe wrapper autour des classes générées par proxy, vous pouvez définir la propriété Url de manière unifiée chaque fois que vous créez la classe wrapper pour appeler une méthode Web.

explorateur de solitions ouvert

clic droit sur le webservice change le comportement d’URL en dynamic

Cliquez sur l’icône “Afficher tous les fichiers” dans l’explorateur de solutions

dans la référence Web, modifiez le fichier Reference.cs

changer de constructeur

 public Service1() { this.Url = "URL"; // etc. ssortingng variable this.Url = ConfigClass.myURL } 

Pour moi, une référence à un WebService est un

RÉFÉRENCE DE SERVICE

.

En tout cas, c’est très facile. Comme quelqu’un l’a dit, il suffit de changer l’URL dans le fichier web.config.

        **** CHANGE THE LINE BELOW TO CHANGE THE URL ****