2009-07-31 10 views
0

J'ai le même service Web ASP.NET déployé 3 fois sous 3 URI différents configurés pour examiner 3 environnements de bases de données différents.Commutation parmi les instances d'un service Web (ASMX)

J'ai une bibliothèque de classes qui utilise WebService à l'aide d'une référence Web.

Chaque fois que je veux compiler la bibliothèque de classes dans un environnement différent, je dois modifier manuellement la référence Web à l'URL appropriée.

Bien que cela ne soit pas compliqué, il est difficile de créer des versions Live de la bibliothèque de classes et ralentit notre processus de déploiement (note rapide: il existe plusieurs fichiers .asmx mais cet exemple en décrit un seul.

Ce que j'essaie de faire est d'avoir une classe DataServices qui retourne une interface pour le WebService. Dans la bibliothèque de classes, les trois références Web existent et j'instancie le bon par simple configuration dans la bibliothèque de classes elle-même, puis renvoyer le bon service Web en tant qu'interface.

Tout cela me semble simple, mais cela ne fonctionne pas car l'interface ne semble pas fonctionner avec les services Web. Quelqu'un peut-il confirmer s'il vous plaît ceci pour moi ou me dire ce que je fais mal?

Impossible de coulée objet de type 'Company.Project.Classes.MyWebServiceLive.MyWebService' de type 'Company.Project.Interfaces.IMyWebService.

Merci

EDIT Le WebService est bien sûr la mise en œuvre de l'interface, ce qui est tout ce que je pensais que je dois faire ...

+0

Aussi s'il vous plaît modifier le titre de la question que ma description est un peu pauvre, mais je ne l'ai jamais essayé auparavant (en utilisant des interfaces) donc je ne sais pas comment décrire mon problème. –

Répondre

2

Vous n'avez pas besoin de changer la référence Web et recompiler. Il suffit de définir la propriété URL du proxy de service Web pour indiquer au service correct:

using (var svc = new MyWebServiceReference.MyService()) { 
    svc.Url = theUrlToUse; 
    return svc.SomeMethod(); 
} 
+0

Homme J'espère que tu as raison! Compte tenu de ma réponse ...va aller le tester maintenant ... –

+0

J'ai raison. Voir http://johnwsaundersiii.spaces.live.com/blog/cns!600A2BE4A82EA0A6!435.entry. Vous n'êtes pas le premier avec ce problème. –

+0

C'est génial, John, je le cherche depuis si longtemps, mais je n'ai jamais pensé à chercher à changer la classe proxy. Merci! –

0

OK, après d'autres recherches, je comprends que c'est parce que la référence Web crée un proxy dans la bibliothèque de classe. Ce proxy n'implémente pas l'interface et la conversion échoue donc.

Je peux modifier manuellement les fichiers de code générés par les proxies pour implémenter l'interface qui fonctionne. Mais la mise à jour de la référence Web remplace toutes les modifications.

Pour ajouter une nouvelle fonction, il faudrait:

  • fonction Ajouter Interface
  • Ajouter la fonction au service Web
  • Mise à jour Web Référence
  • mettre en œuvre manuellement l'interface sur la nouvelle classe proxy pour chaque Web Service

À moins que quelqu'un ne puisse suggérer autre chose (comme comment utiliser un WebService par un gène évaluer vos propres classes proxy Je pense que je vais revenir à changer l'URI de référence Web pour chaque environnement construire ... douloureux mais pas aussi déconcertant que ce qui précède!

Questions connexes