2009-07-31 9 views
0

Ich habe den gleichen ASP.NET WebService 3 Mal unter 3 verschiedenen URIs bereitgestellt, die konfiguriert sind, um 3 verschiedene Datenbankumgebungen zu betrachten.Wechseln zwischen Instanzen eines Web-Service (ASMX)

Ich habe eine Klassenbibliothek, die den WebService mit einer Web-Referenz verwendet.

Jedes Mal, wenn ich die Klassenbibliothek in eine andere Umgebung kompilieren möchte, muss ich die Web Reference von Hand auf die entsprechende URL ändern.

Obwohl dies nicht kompliziert ist, ist dies ein Problem beim Erstellen von Live-Versionen der Klassenbibliothek und verlangsamt unseren Bereitstellungsprozess (Eine kurze Anmerkung, es gibt mehrere .asmx-Dateien, aber dieses Beispiel beschreibt nur 1, so dass es leichter zu verstehen ist).

Was ich versuche, ist eine DataServices-Klasse, die eine Schnittstelle für den WebService zurückgibt. In der Klassenbibliothek sind alle 3 Webreferenzen vorhanden, und ich instanziiere die richtige über die einfache Konfiguration in der Klassenbibliothek selbst und gebe dann den richtigen Webdienst als Schnittstelle zurück.

Das scheint alles einfach zu mir, aber es funktioniert nicht, da die Schnittstelle scheint nicht funktionieren, obwohl Web Services. Kann mir bitte jemand das bestätigen oder mir sagen, was ich falsch mache?

Kann Objekt des Typs 'Company.Project.Classes.MyWebServiceLive.MyWebService' to cast 'Company.Project.Interfaces.IMyWebService' einzugeben.

Dank

EDIT Der WebService natürlich ist die Schnittstelle implementiert, die alles, was ich ich tun gedacht ist bräuchten ...

+0

Ändern Sie bitte auch den Titel der Frage, da meine Beschreibung ein wenig schlecht ist, aber ich habe dies noch nie zuvor (mit Schnittstellen) versucht, so nicht sicher, wie ich mein Problem beschreiben soll. –

Antwort

2

Sie brauchen nicht auf die Web-Referenz zu ändern und neu kompilieren. Setzen Sie einfach auf dem richtigen Service Punkt der URL-Eigenschaft des Web-Service-Proxy:

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

Mann Ich hoffe dein Recht! Angesichts meiner Antwort ...werde es jetzt testen ... –

+0

Ich habe Recht. Siehe http://johnwsaundersiii.spaces.live.com/blog/cns!600A2BE4A82EA0A6!435.eintrag. Du bist nicht der Erste mit diesem Problem. –

+0

Das ist toll Prost John, ich habe das schon so lange gesucht, aber ich habe nie daran gedacht, die Proxy-Klasse zu ändern. Vielen Dank! –

0

OK, nachdem weitere Forschung Ich verstehe, dass es ist, weil die Web-Referenz einen Proxy in der Klassenbibliothek erstellt. Dieser Proxy implementiert die Schnittstelle nicht und die Konvertierung schlägt daher fehl.

Ich kann die proxies generierten Code-Dateien manuell ändern, um die Schnittstelle zu implementieren, die funktioniert. Wenn Sie jedoch die Webreferenz aktualisieren, werden alle Änderungen überschrieben.

Um eine neue Funktion erfordern würde hinzufügen:

  • Add-Funktion Schnittstelle
  • hinzufügen Funktion Web Service
  • Update-Referenz
  • manuell die Schnittstelle auf der neuen Proxy-Klasse implementieren für jede Web Service

Es sei denn jemand kann etwas anderes vorschlagen (wie man einen Webservice durch Gen. Bewerten Sie Ihre eigenen Proxy-Klassen Ich denke, ich werde zurückgehen, um die Web Reference URI für jede Umgebung zu ändern ... schmerzhaft, aber nicht so abschreckend wie oben!