Comment puis-je changer dynamiquement les adresses de service web in.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.), de sorte qu'il est facilement changé. Une utilisation majeure de ceci sera de déployer à 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 située ailleurs.

Peut-être que je viens d'être gâté par L'Assistant Visual Studio "ajouter une référence Web" - ressemble à ceci doit être quelque chose de relativement facile, cependant.

53
demandé sur Luke Girvin 2008-09-24 08:20:36

11 réponses

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 propriétés, vous devriez voir quelque chose comme ceci:

Propriétés De Référence Web

Changer la valeur en dynamique mettra une entrée dans votre application.config.

Voici l'article CodePlex {[9] } qui contient plus d'informations.

51
répondu Eric Schoonover 2017-02-08 14:08:15

Si vous définissez vraiment dynamiquement cela, vous devez définir le .Champ Url de l'instance de la classe proxy que vous appelez.

Définition de la valeur dans le .fichier de configuration à partir de votre programme:

  1. Est un gâchis;

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

Si c'est seulement quelque chose qui doit être fait une fois par installation, je serais d'accord avec les autres affiches et utiliser le .fichier de configuration et le paramètre dynamique.

29
répondu Brad Bruce 2014-03-13 18:53:44

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 des paramètres de l'application ou d'une autre source. Dans mon cas, c'est une liste déroulante où l'utilisateur sélectionne le serveur. TheService a été configuré via VS ajouter une référence de service.

private void CallTheService( string url )
{
   TheService.TheServiceClient client = new TheService.TheServiceClient();
   client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url);
   var results = client.AMethodFromTheService();
}
13
répondu rwg 2016-11-30 14:55:33

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 service web à l'exécution est de remplacer le constructeur, ce que j'ai fait avec une déclaration de classe partielle. Ce qui précède, la définition du comportement de L'URL À dynamique doit également être fait.

Cela crée essentiellement un wrapper de service web où si vous devez recharger le service web à un moment donné, via add Service reference, vous ne perdez pas votre travail. L'aide de Microsoft pour Classes partielles spécialement les états qu'une partie de la raison de cette construction est de créer des web services gestionnaires. 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;
            }
        }
    }
}
6
répondu John Kocktoasten 2013-06-27 12:51:11

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

5
répondu Gulzar Nazim 2011-12-21 08:47:33

Tant que les méthodes de service web et les classes exposées sous-jacentes ne changent pas, c'est assez trivial. Avec Visual Studio 2005 (et plus récent), l'ajout d'une référence web crée une application.config (ou web.config, pour les applications web) section qui a cette URL. Tout ce que vous avez à faire est de modifier l'application.fichier de configuration pour refléter L'URL souhaitée.

Dans notre projet, notre approche simple était d'avoir juste l'application.entrées de configuration commentées par type d'environnement (développement, test, production). Afin que nous venons de dé-commenter l'entrée pour le type d'environnement. Aucun codage nécessaire.

4
répondu cruizer 2008-09-24 05:33:01

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

  • Statique : vous devez définir la propriété URL chaque fois que vous appelez le service web. Cela parce que L'URL de base si le service web est dans le constructeur de la classe proxy.
  • Dynamique: une clé de configuration sera créé pour vous dans votre web.config fichier. Par défaut, la classe proxy Lira L'URL de cette clé.
2
répondu stefano m 2011-12-21 08:50:39

Si vous récupérez l'URL à partir d'une base de données, vous pouvez l'affecter manuellement à la propriété URL de classe de proxy de 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 les classes proxy URL comportement dynamique.

2
répondu Aaron Fischer 2012-01-10 07:59:42

Certainement utiliser la propriété Url est la voie à suivre. Si, pour l'application.config, la base de données 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. Vous n'avez peut-être pas d'équilibreur de charge qui redimensionne le backend. Vous pourriez être Hot-patcher un bug 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 production db ou même les informations d'authentification de sécurité ws. La séparation appropriée des tâches peut vous mettre dans des configurations de configuration plus impliquées.

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.

1
répondu mspmsp 2008-09-24 15:19:52

Ouvrir solition explorer

Cliquez avec le bouton droit sur le comportement de l'URL du service web pour le rendre dynamique

Cliquez sur l'icône "Afficher tous les fichiers" dans l'Explorateur de solutions

Dans la référence web, Modifiez la référence.fichier cs

Changer le constructeur

public Service1() {
        this.Url = "URL"; // etc. string  variable this.Url = ConfigClass.myURL
      }
0
répondu mesutpiskin 2016-02-22 21:08:23

Pour moi, une référence à un service web est un

RÉFÉRENCE DE SERVICE

.

De toute façon, c'est très facile. Comme quelqu'un l'a dit, il vous suffit de changer l'URL sur le web.fichier de configuration.

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="YourServiceSoap" />
      </basicHttpBinding>
    </bindings>
    <client>
        **** CHANGE THE LINE BELOW TO CHANGE THE URL **** 
        <endpoint address="http://10.10.10.100:8080/services/YourService.asmx"
          binding="basicHttpBinding" bindingConfiguration="YourServiceSoap"
          contract="YourServiceRef.YourServiceSoap" name="YourServiceSoap" />
    </client>
0
répondu djciko 2016-05-11 16:48:48