webentwicklung-frage-antwort-db.com.de

Wie kann ich Webdienstadressen in .NET ohne erneute Kompilierung dynamisch wechseln?

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.

56
stames

Wenn Sie eine Webreferenz erstellen und auf die Webreferenz im Projektmappen-Explorer klicken. Im Eigenschaftenbereich sollten Sie etwa Folgendes sehen:

Web Reference Properties

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.

52
Eric Schoonover

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:

  1. Ist ein Durcheinander;

  2. 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.

29
Brad Bruce

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();
}
16
rwg

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;
            }
        }
    }
}
6

Ändern Sie das URL-Verhalten in " Dynamic ".

5
Gulzar Nazim

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.

4
cruizer

Nur eine Anmerkung zum Unterschied zwischen statisch und dynamisch.

  • Statisch : Sie müssen die URL-Eigenschaft bei jedem Aufruf des Web-Service festlegen. Dies liegt daran, dass die Basis-URL für den Webdienst im Proxy-Klassenkonstruktor enthalten ist.
  • Dynamic : In Ihrer Datei web.config wird ein spezieller Konfigurationsschlüssel für Sie erstellt. Standardmäßig liest die Proxy-Klasse die URL aus diesem Schlüssel.
2
stefano m

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.

2
Aaron Fischer

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.

1
mspmsp

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>
0
djciko

Ö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
      }
0
mesutpiskin