Question

J'ai un code qui fait référence à un service Web et j'aimerais que l'adresse de ce service soit dynamique (lue dans une base de données, un fichier de configuration, etc.) afin de pouvoir la changer facilement. L’une des principales utilisations de cette solution consiste à 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 Visual Studio " Ajouter une référence Web " assistant - semble que cela devrait être quelque chose de relativement facile, cependant.

Était-ce utile?

La solution

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

Si vous modifiez la valeur en dynamique, une entrée sera insérée dans votre app.config.

Voici le article de CodePlex qui contient davantage d'informations.

Autres conseils

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

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

  1. est un désordre;

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

S'il ne s'agit que d'une opération à effectuer une fois par installation, je suis d'accord avec les autres affiches et j'utilise le fichier .config et le paramètre dynamique.

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 la chaîne peut provenir de paramètres d'application ou d'une autre source. Dans mon cas, il s’agit d’une liste déroulante dans laquelle l’utilisateur sélectionne le serveur. TheService a été configuré via VS add service reference.

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

Je suis aux prises avec ce problème depuis quelques jours et l’ampoule a finalement cliqué. La clé pour pouvoir changer l'URL d'un webservice à l'exécution est écrasant le constructeur, ce que j'ai fait avec une déclaration de classe partielle. Ce qui précède, définissant le comportement de l'URL sur dynamique doit également être effectué.

Cela crée essentiellement un wrapper de service Web dans lequel, si vous devez recharger un service Web à un moment donné, via la référence de service supplémentaire, vous ne perdez pas votre travail. L'aide de Microsoft pour les classes partielles indique spécialement 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(string szURL)
        {
            this.Url = szURL;
            if ((this.IsLocalFileSystemWebService(this.Url) == true))
            {
                this.UseDefaultCredentials = true;
                this.useDefaultCredentialsSetExplicitly = false;
            }
            else
            {
                this.useDefaultCredentialsSetExplicitly = true;
            }
        }
    }
}

Modifiez le comportement de l'URL en " dynamique ".

Tant que les méthodes de service Web et les classes exposées sous-jacentes ne changent pas, c'est assez simple. Avec Visual Studio 2005 (et plus récent), l’ajout d’une référence Web crée une section app.config (ou web.config, pour les applications Web) comportant cette URL. Il vous suffit 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 décommentons donc l'entrée pour le type d'environnement souhaité. Aucun codage spécial nécessaire là-bas.

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

  • Statique : vous devez définir la propriété URL à chaque appel du 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 dans votre fichier web.config . Par défaut, la classe proxy lit l'URL à partir de cette clé.

Si vous extrayez l'URL d'une base de données, vous pouvez l'affecter 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 de proxy sur dynamique.

Utiliser définitivement la propriété Url est la voie à suivre. Que ce soit pour le définir dans le fichier app.config, la base de données ou un troisième emplacement, cela dépend de vos besoins en matière de configuration. Parfois, vous ne souhaitez pas que l'application redémarre lorsque vous modifiez l'emplacement du service Web. Vous pourriez ne pas avoir d'équilibreur de charge mettant à l'échelle le backend. Vous êtes peut-être en train de patcher à chaud un bogue de service Web. Votre implémentation peut également avoir des problèmes de configuration de sécurité. Qu'il s'agisse de noms d'utilisateur et de mots de passe de production, voire des informations d'authentification de sécurité ws La séparation 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 le proxy, vous pouvez définir la propriété Url d'une manière unifiée chaque fois que vous créez la classe wrapper pour appeler une méthode Web.

ouvrir l'explorateur de solition

cliquez avec le bouton droit de la souris sur le comportement du service Web de changement d'URL sur dynamique

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. string  variable this.Url = ConfigClass.myURL
      }

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

  

RÉFÉRENCE DE SERVICE

.

Quoi qu'il en soit, c'est très facile. Comme quelqu'un l'a dit, il vous suffit de modifier l'URL dans le fichier web.config.

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top