Ich habe Code, der auf einen Webdienst verweist, und ich möchte, dass die Adresse dieses Webdienstes dynamisch ist (aus einer Datenbank gelesen, Konfigurationsdatei usw.), sodass er leicht geändert werden kann. Dies wird hauptsächlich in mehreren Umgebungen eingesetzt, in denen sich Rechnernamen und IP-Adressen unterscheiden. Die Web-Service-Signatur ist in allen Implementierungen gleich und nur an anderer Stelle vorhanden.
Möglicherweise wurde ich vom Visual Studio-Assistenten zum Hinzufügen von Webreferenzen verwöhnt. Dies scheint jedoch relativ einfach zu sein.
Wenn Sie eine Webreferenz erstellen und auf die Webreferenz im Projektmappen-Explorer klicken. Im Eigenschaftenbereich sollten Sie etwa Folgendes sehen:
Wenn Sie den Wert in dynamic ändern, wird ein Eintrag in Ihre app.config eingefügt.
Hier ist der CodePlex-Artikel der mehr Informationen enthält.
Wenn Sie dies wirklich dynamisch einstellen, sollten Sie das .Url-Feld der Instanz der Proxyklasse festlegen, die Sie aufrufen.
Den Wert in der .config-Datei in Ihrem Programm festlegen:
Ist ein Durcheinander;
Kann nicht bis zum nächsten Start der Anwendung gelesen werden.
Wenn nur einmal pro Installation etwas getan werden muss, stimme ich den anderen Postern zu und verwende die .config-Datei und die dynamische Einstellung.
Ich weiß, das ist eine alte Frage, aber unsere Lösung ist viel einfacher als das, was ich hier sehe. Wir verwenden es für WCF-Anrufe mit VS2010 und höher. Die String-URL kann von App-Einstellungen oder einer anderen Quelle stammen. In meinem Fall ist es eine Dropdown-Liste, in der der Benutzer den Server auswählt. Der Dienst wurde über die VS-Dienstreferenz "Hinzufügen" konfiguriert.
private void CallTheService( string url )
{
TheService.TheServiceClient client = new TheService.TheServiceClient();
client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url);
var results = client.AMethodFromTheService();
}
Ich habe seit ein paar Tagen mit diesem Problem zu kämpfen und schließlich klickte die Glühbirne. Der Schlüssel, um die URL eines Webservice zur Laufzeit ändern zu können, setzt den Konstruktor außer Kraft, was ich mit einer partiellen Klassendeklaration getan habe. Das obige Festlegen des URL-Verhaltens auf Dynamic muss ebenfalls erfolgen.
Dadurch wird im Wesentlichen ein Web-Service-Wrapper erstellt, bei dem Sie Ihre Arbeit nicht verlieren, wenn Sie den Web-Service irgendwann über das Hinzufügen von Service-Referenzen neu laden müssen. In der Microsoft-Hilfe für Teilklassen wird speziell angegeben, dass ein Teil des Grunds für dieses Konstrukt das Erstellen von Web-Service-Wrappern ist. http://msdn.Microsoft.com/de-de/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;
}
}
}
}
Ändern Sie das URL-Verhalten in " Dynamic ".
Solange sich die Web-Service-Methoden und die zugrunde liegenden exponierten Klassen nicht ändern, ist dies ziemlich trivial. Bei Visual Studio 2005 (und neuer) wird durch das Hinzufügen eines Webverweises ein Abschnitt app.config (oder web.config für Webanwendungen) erstellt, der diese URL enthält. Sie müssen lediglich die Datei app.config bearbeiten, um die gewünschte URL anzuzeigen.
In unserem Projekt bestand unser einfacher Ansatz darin, die app.config-Einträge nur nach Umgebungstyp (Entwicklung, Testen, Produktion) zu kommentieren. Wir kommentieren also einfach den Eintrag für den gewünschten Umgebungstyp. Es ist keine spezielle Codierung erforderlich.
Nur eine Anmerkung zum Unterschied zwischen statisch und dynamisch.
Wenn Sie die URL aus einer Datenbank abrufen, können Sie sie manuell der URL-Eigenschaft der Webdienst-Proxyklasse zuordnen. Dies sollte vor dem Aufruf der Webmethode erfolgen.
Wenn Sie die Konfigurationsdatei verwenden möchten, können Sie das Verhalten der Proxy-Klassen-URL auf dynamisch setzen.
Die Verwendung der URL-Eigenschaft ist definitiv der Weg. Ob Sie dies in der app.config, der Datenbank oder einer dritten Position festlegen, hängt von Ihren Konfigurationsanforderungen ab. Manchmal möchten Sie nicht, dass die App neu gestartet wird, wenn Sie den Web-Service-Standort ändern. Möglicherweise haben Sie keinen Load Balancer, der das Backend skaliert. Sie können einen Web-Service-Fehler per Hot-Patch beheben. Ihre Implementierung kann auch Probleme mit der Sicherheitskonfiguration haben. Ob es sich um Benutzernamen und Kennwörter für die Herstellung von Datenbank-DBs oder sogar um die ws-Sicherheitsauthentifizierungsinformationen handelt. Durch die ordnungsgemäße Aufgabentrennung können Sie einige aufwendigere Konfigurationseinstellungen erhalten.
Wenn Sie den Proxy-generierten Klassen eine Wrapper-Klasse hinzufügen, können Sie die Url-Eigenschaft bei jeder Erstellung der Wrapper-Klasse auf vereinheitlichte Weise festlegen, um eine Webmethode aufzurufen.
Für mich ist ein Verweis auf einen Web Service ein
.
Trotzdem ist es sehr einfach. Wie jemand gesagt hat, müssen Sie nur die URL in der Datei web.config ändern.
Code-Auszug.
<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>
Öffnen Sie den Lösungs-Explorer
klicken Sie mit der rechten Maustaste auf den Webservice, um das URL-Verhalten in Dynamic zu ändern
klicken Sie im Projektmappen-Explorer auf das Symbol "Alle Dateien anzeigen"
bearbeiten Sie in der Webreferenz die Datei Reference.cs
konstrukteur ändern
public Service1() {
this.Url = "URL"; // etc. string variable this.Url = ConfigClass.myURL
}