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 qu'elle puisse être facilement modifiée. 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 l'assistant "Ajouter une référence Web" de Visual Studio m'a gâté. Cela semble être quelque chose de relativement simple, 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:
Changer la valeur en dynamique 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 dynamique, vous devez définir le champ .Url d'instance de la classe de proxy que vous appelez.
Définition de la valeur dans le fichier .config à partir de votre programme:
Est un gâchis;
Peut ne pas être lu avant le démarrage de la prochaine application.
S'il ne s'agit que d'une tâche à 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 de surcharger le constructeur, ce que j'ai fait avec une déclaration de classe partielle. Ce qui précède, vous devez également définir le comportement de l'URL sur Dynamique.
Cela crée essentiellement un wrapper de service Web dans lequel, si vous devez recharger un service Web à un moment donné, via une 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. 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 décommentons donc l'entrée pour le type d'environnement souhaité. Aucun codage spécial nécessaire là-bas.
Juste une note sur la différence entre statique et dynamique.
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 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é. Que ce soit des noms d’utilisateur et des mots de passe de production, voire les informations d’authentification de la sécurité ws. La séparation adéquate 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.
Pour moi, une référence à un service Web est un
.
En tout cas c'est très facile. Comme quelqu'un l'a dit, il vous suffit de changer l'URL dans le fichier web.config.
Extrait de code.
<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>
solition ouverte explorer
cliquez avec le bouton droit sur le comportement du Webservice Change URL to Dynamic
cliquez sur l'icône "Afficher tous les fichiers" dans l'explorateur de solutions.
dans la référence Web, éditez le fichier Reference.cs
changer de constructeur
public Service1() {
this.Url = "URL"; // etc. string variable this.Url = ConfigClass.myURL
}