Domanda

Ho un codice che fa riferimento a un servizio Web e vorrei che l'indirizzo di quel servizio Web fosse dinamico (letto da un database, file di configurazione, ecc.) in modo che possa essere facilmente modificato. Un uso importante di questo sarà distribuire in più ambienti in cui i nomi dei computer e gli indirizzi IP sono diversi. La firma del servizio Web sarà la stessa in tutte le distribuzioni, situata altrove.

Forse sono stato rovinato da Visual Studio " Aggiungi riferimento web " procedura guidata - sembra che questo dovrebbe essere qualcosa di relativamente semplice, tuttavia.

È stato utile?

Soluzione

Quando si genera un riferimento Web e si fa clic sul riferimento Web in Esplora soluzioni. Nel riquadro delle proprietà dovresti vedere qualcosa del genere:

Proprietà di riferimento Web

La modifica del valore in dinamico inserirà una voce in app.config.

Ecco l'articolo CodePlex che contiene ulteriori informazioni.

Altri suggerimenti

Se lo stai impostando in modo dinamico, dovresti impostare il campo .Url dell'istanza della classe proxy che stai chiamando.

Impostazione del valore nel file .config all'interno del programma:

  1. È un casino;

  2. Potrebbe non essere letto fino all'avvio dell'applicazione successiva.

Se è solo qualcosa che deve essere fatto una volta per installazione, sarei d'accordo con gli altri poster e utilizzerei il file .config e l'impostazione dinamica.

So che questa è una vecchia domanda, ma la nostra soluzione è molto più semplice di quella che vedo qui. Lo usiamo per le chiamate WCF con VS2010 e versioni successive. L'URL della stringa può provenire dalle impostazioni dell'app o da un'altra fonte. Nel mio caso è un elenco a discesa in cui l'utente seleziona il server. Il servizio è stato configurato tramite VS aggiungere il riferimento al servizio.

private void CallTheService( string url )
{
   TheService.TheServiceClient client = new TheService.TheServiceClient();
   client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url);
   var results = client.AMethodFromTheService();
}

Ho lottato con questo problema per alcuni giorni e finalmente la lampadina ha fatto clic. La chiave per poter cambiare l'URL di un servizio web in fase di esecuzione è sovrascrivere il costruttore, cosa che ho fatto con una dichiarazione di classe parziale. Quanto sopra, anche l'impostazione del comportamento dell'URL su Dynamic deve essere eseguita.

Questo fondamentalmente crea un wrapper di servizio web in cui se devi ricaricare il servizio web ad un certo punto, tramite l'aggiunta del riferimento al servizio, non perdi il tuo lavoro. La guida di Microsoft per le classi parziali afferma in particolare che parte del motivo di questo costrutto è la creazione di wrapper di servizi Web. http://msdn.microsoft.com/en- us / 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;
            }
        }
    }
}

Cambia il comportamento dell'URL in " Dynamic ".

Fintanto che i metodi del servizio Web e le classi esposte sottostanti non cambiano, è abbastanza banale. Con Visual Studio 2005 (e versioni successive), l'aggiunta di un riferimento Web crea una sezione app.config (o web.config, per le app Web) con questo URL. Tutto quello che devi fare è modificare il file app.config per riflettere l'URL desiderato.

Nel nostro progetto, il nostro approccio semplice consisteva nel far commentare le voci app.config per tipo di ambiente (sviluppo, test, produzione). Quindi decommentiamo semplicemente la voce per il tipo di ambiente desiderato. Non è necessaria alcuna codifica speciale lì.

Solo una nota sulla differenza tra statica e dinamica.

  • Statico : devi impostare la proprietà URL ogni volta che chiami il servizio web. Questo perché l'URL di base se il servizio Web è nel costruttore della classe proxy.
  • Dinamico : una chiave di configurazione speciale verrà creata per te nel tuo file web.config . Per impostazione predefinita, la classe proxy leggerà l'URL da questa chiave.

Se si sta recuperando l'URL da un database, è possibile assegnarlo manualmente alla proprietà URL della classe proxy del servizio Web. Questo dovrebbe essere fatto prima di chiamare il metodo web.

Se si desidera utilizzare il file di configurazione, è possibile impostare il comportamento dell'URL delle classi proxy su dinamico.

Sicuramente usare la proprietà Url è la strada da percorrere. Se impostarlo in app.config, nel database o in una terza posizione dipende dalle esigenze di configurazione. A volte non si desidera riavviare l'app quando si cambia la posizione del servizio Web. Potrebbe non essere necessario un bilanciamento del carico che ridimensiona il back-end. È possibile che stia correggendo a caldo un bug del servizio Web. L'implementazione potrebbe anche avere problemi di configurazione della sicurezza. Che si tratti di nomi utente e password di produzione db o anche delle informazioni sull'autorizzazione di sicurezza di ws. La corretta separazione dei compiti può farti entrare in alcune configurazioni di configurazione più coinvolte.

Se aggiungi una classe wrapper attorno alle classi generate dal proxy, puoi impostare la proprietà Url in modo unificato ogni volta che crei la classe wrapper per chiamare un metodo web.

open solition explorer

fai clic con il pulsante destro del mouse sul comportamento dell'URL di modifica del servizio web in Dinamico

fai clic sull'icona "mostra tutti i file" in Esplora soluzioni

nel riferimento web modificare il file Reference.cs

cambia costruttore

public Service1() {
        this.Url = "URL"; // etc. string  variable this.Url = ConfigClass.myURL
      }

Per me un riferimento a un WebService è un

  

RIFERIMENTO SERVIZIO

.

Comunque è molto semplice. Come qualcuno ha detto, devi solo cambiare l'URL nel file web.config.

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top