2010-03-09 7 views
3

J'ai hérité d'un projet de site Web qui utilise un certain nombre de services Web WCF hébergés sur un serveur BizTalk. Nous avons deux environnements dont j'ai besoin pour déployer ce projet, avec des URL différentes pour les différents serveurs BizTalk.Mise à jour de la référence Web dans Visual Studio

à savoir Dans l'environnement Mise en scène, je dois souligner les services à xx.xx.xx.101
Dans l'environnement direct, je dois les signaler à xx.xx.xx.102, ou autre chose.

Actuellement, nous avons toutes les URL stockées dans les clés du fichier web.config, afin que nous puissions les modifier dynamiquement. Malheureusement, cela ne fonctionne pas.

Si je change l'URL dans le web.config autre chose que ce que le projet a été compilé avec, je reçois une erreur lorsque vous appelez le service:

serveur ne reconnaît pas la valeur de tête HTTP SOAPAction : xx.xx.xx.101 \ ServiceName \ MethodName

On me dit que la seule façon qu'ils ont connus à déployer est de mettre à jour les URL web.config, changer toutes les références web en Visual Studio à faire correspondre, cliquez sur "Mettre à jour la référence Web" pour chaque référence dans Visual Studio, puis compilez.

J'ai écrit un script NAnt de pré-construction pour parcourir et remplacer toutes les instances de l'URL trouvées n'importe où dans le répertoire du projet, et même cela ne fait aucune différence.

Il doit y avoir quelque chose d'autre retiré du service lorsque je clique sur le "Update Reference", mais je ne sais pas quoi.

Quelqu'un a-t-il des idées? Y a-t-il un moyen de le faire par programme?

+0

S'agit-il de références Web ou de références de service? –

Répondre

0

Bon ... Je pense que je l'ai corrigé!

J'ai abandonné toutes les références Web Visual Studio, en faveur des classes proxy générées par la tâche "wsdl" NAntContrib.

Le script va maintenant mettre à jour toutes les références en fonction du type de build que vous avez sélectionné (Debug, Release, etc.).Cela ne répond toujours pas pourquoi le problème se produisait en premier lieu, mais je soupçonne que c'est comme mattanja suggéré, et il y a une différence dans les services Web sur chaque serveur.

Mise à jour La cause profonde de ce problème est que celui déployé les services Web sur les deux serveurs avaient utilisé différents espaces de noms pour chaque déploiement. Redéployer les services Web en utilisant le même espace de noms a résolu le problème et a supprimé le besoin de toute cette bêtise NAnt.

3

Les services Web référencés sont-ils exactement identiques sur les différents serveurs à l'exception de l'URL? En particulier, l'espace de nom doit être le même pour tous les services référencés.

Si les espaces de noms et tout le reste sont exactement les mêmes sur votre webservice référencé, vous n'aurez qu'à mettre à jour votre point de terminaison webservice, pas toute la référence Web. Vous pouvez définir le point final en définissant simly la propriété URL de votre service à votre valeur de configuration

YourServiceReference yourService = new YourServiceReference(); 
yourService.Url = "http://yourconfigendpoint"; 

EDIT: Ceci est pour webservices style ancien, pas shure au sujet WCF mais devrait être similaire ..?

+0

Bonjour Mattanja, Désolé si je n'ai pas précisé cela, mais je suis déjà en train de définir la propriété URL à la valeur web.config. Après que cela est fait, j'obtiens l'erreur montrée ci-dessus. Le service se connecte au serveur correct, mais ensuite les erreurs après cela. – NeilD

+0

Oui, désolé j'ai aussi remarqué par la suite que je ne peux pas vraiment vous avoir donné la réponse que vous avez recherchée :) - édité – mattanja

+0

Pour être honnête, je ne suis pas convaincu que les services Web sont les mêmes sur les deux serveurs. Malheureusement, ils ne sont pas mes serveurs, et c'est difficile à vérifier! – NeilD

0

NeilD! Je pense que le remplacement complet de l'URL dans le projet n'est pas la meilleure solution. Je pense que les appels au service WCF dans le Web ont fait passer des contrats de message. Pouvez-vous placer ici l'extrait de code d'appel d'une méthode de service. Vous devez remplacer uniquement l'URL présente dans le constructeur du proxy. D'autres URLs, qui spécifie le nom de la méthode doivent rester immuables

+0

Salut Yuriy ... Le code pour appeler la méthode de service est presque identique à l'extrait posté ci-dessus par mattanja. J'ai réussi à résoudre le problème en utilisant NAnt, mais merci pour votre temps. – NeilD

Questions connexes