75 votes

Comment puis-je changer dynamiquement d'adresse de service web dans .NET sans recompiler ?

J'ai du code qui fait référence à un service web, et j'aimerais que l'adresse de ce service web soit dynamique (lue à partir d'une base de données, d'un fichier de configuration, etc.) afin qu'elle puisse être facilement modifiée. Une des principales utilisations de ce système sera le déploiement dans plusieurs environnements où les noms de machine et les adresses IP sont différents. La signature du service web sera la même dans tous les déploiements, mais elle sera simplement située ailleurs.

J'ai peut-être été gâté par l'assistant "Add Web Reference" de Visual Studio, mais il me semble que cela devrait être relativement facile.

0 votes

Utilisez-vous Visual Studio 2005 ou 2008 ? Je crois que les assistants sont légèrement différents dans chaque cas.

59voto

spoon16 Points 17694

Lorsque vous générez une référence web et que vous 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 :

Web Reference Properties

En changeant la valeur en dynamique, une entrée sera ajoutée dans votre app.config.

Voici le Article de CodePlex qui contient plus d'informations.

1 votes

Où va le fichier app.config lorsque je le publie ? je ne le vois pas dans le répertoire de sortie de la publication.

3 votes

Il sera renommé en [OutputAssemblyName].config. Exemple : MonProjet.exe.config

3 votes

La réponse de Brad Bruce ci-dessous est bien plus utile dans certaines situations : vous pouvez modifier la propriété Url de l'objet service web.

32voto

Brad Bruce Points 4359

Si vous le définissez vraiment de manière dynamique, vous devez définir le champ .Url de l'instance de la classe proxy que vous appelez.

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

  1. C'est un désordre ;

  2. Il se peut qu'il ne soit pas lu avant le prochain lancement de l'application.

S'il s'agit d'une opération qui ne doit être effectuée qu'une fois par installation, je suis d'accord avec les autres posteurs et j'utilise le fichier .config et le paramètre dynamique.

11 votes

Eg. var api = new MyApi.Service(); api.Url = "http://yetanotherurl.com";

0 votes

C'est ce que j'ai fait mais en production le lien n'est pas modifié, il prend toujours l'ancien lien.

9voto

J'ai lutté avec ce problème pendant quelques jours et finalement l'ampoule a cliqué. La clé pour pouvoir changer l'URL d'un webservice au moment de l'exécution est de surcharger le constructeur, ce que j'ai fait avec une déclaration de classe partielle. Ce que je viens de faire, en définissant le comportement de l'URL sur Dynamic, doit également être fait.

Cela crée essentiellement une enveloppe 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 précise que cette construction est en partie destinée à créer des enveloppes de services 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(string szURL)
        {
            this.Url = szURL;
            if ((this.IsLocalFileSystemWebService(this.Url) == true))
            {
                this.UseDefaultCredentials = true;
                this.useDefaultCredentialsSetExplicitly = false;
            }
            else
            {
                this.useDefaultCredentialsSetExplicitly = true;
            }
        }
    }
}

5voto

Gulzar Nazim Points 35342

Changez le comportement de l'URL en " Dynamique ".

0 votes

Le lien ne semble pas s'ouvrir.

4voto

cruizer Points 4821

Tant que les méthodes du service web et les classes exposées sous-jacentes ne changent pas, c'est assez trivial. Avec Visual Studio 2005 (et les versions plus récentes), l'ajout d'une référence Web crée une section app.config (ou web.config, pour les applications Web) qui comporte 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 était d'avoir simplement les entrées app.config commentées par type d'environnement (développement, test, production). Il suffit donc de décommenter l'entrée correspondant au type d'environnement souhaité. Aucun codage spécial n'est nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X