¿Cómo puedo cambiar dinámicamente las direcciones de servicios web en .NET sin volver a compilar?

StackOverflow https://stackoverflow.com/questions/125399

Pregunta

Tengo un código que hace referencia a un servicio web y me gustaría que la dirección de ese servicio web sea dinámica (lectura de una base de datos, archivo de configuración, etc.) para que se pueda cambiar fácilmente.Un uso importante de esto será implementar en múltiples entornos donde los nombres de las máquinas y las direcciones IP sean diferentes.La firma del servicio web será la misma en todas las implementaciones, solo que estará ubicada en otro lugar.

Tal vez el asistente "Agregar referencia web" de Visual Studio me haya echado a perder; sin embargo, parece que esto debería ser algo relativamente fácil.

¿Fue útil?

Solución

Cuando genera una referencia web y hace clic en la referencia web en el Explorador de soluciones.En el panel de propiedades deberías ver algo como esto:

Web Reference Properties

Cambiar el valor a dinámico colocará una entrada en su app.config.

Aquí está el Artículo de CodePlex que tiene más información.

Otros consejos

Si realmente está configurando esto de forma dinámica, debe configurar el campo .Url de la instancia de la clase de proxy a la que está llamando.

Estableciendo el valor en el archivo .config desde dentro de su programa:

  1. Es un lío;

  2. Es posible que no se lea hasta que se inicie la siguiente aplicación.

Si es algo que solo debe hacerse una vez por instalación, estaría de acuerdo con los demás carteles y usaría el archivo .config y la configuración dinámica.

Sé que esta es una vieja pregunta, pero nuestra solución es mucho más simple de lo que veo aquí.Lo usamos para llamadas WCF con VS2010 y versiones posteriores.La URL de la cadena puede provenir de la configuración de la aplicación u otra fuente.En mi caso es una lista desplegable donde el usuario elige el servidor.El servicio se configuró a través de la referencia de servicio adicional de VS.

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

He luchado con este problema durante unos días y finalmente la bombilla hizo clic.La CLAVE para poder cambiar la URL de un servicio web en tiempo de ejecución es anular el constructor, lo cual hice con una declaración de clase parcial.También se debe hacer lo anterior, estableciendo el comportamiento de la URL en Dinámico.

Básicamente, esto crea un contenedor de servicio web donde, si tiene que recargar el servicio web en algún momento, mediante la adición de referencia de servicio, no pierde su trabajo.La ayuda de Microsoft para clases parciales establece especialmente que parte del motivo de esta construcción es crear contenedores de servicios 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;
            }
        }
    }
}

Cambie el comportamiento de la URL a "Dinámica".

Mientras los métodos del servicio web y las clases expuestas subyacentes no cambien, es bastante trivial.Con Visual Studio 2005 (y versiones posteriores), agregar una referencia web crea una sección app.config (o web.config, para aplicaciones web) que tiene esta URL.Todo lo que tienes que hacer es editar el archivo app.config para reflejar la URL deseada.

En nuestro proyecto, nuestro enfoque simple fue comentar las entradas de app.config por tipo de entorno (desarrollo, prueba, producción).Así que simplemente descomentamos la entrada del tipo de entorno deseado.Allí no se necesita ninguna codificación especial.

Sólo una nota sobre la diferencia entre estático y dinámico.

  • Estático:debe configurar la propiedad URL cada vez que llame al servicio web.Esto se debe a que la URL base si el servicio web está en el constructor de la clase proxy.
  • Dinámica:Se creará una clave de configuración especial para usted en su web.config archivo.De forma predeterminada, la clase de proxy leerá la URL de esta clave.

Si está obteniendo la URL de una base de datos, puede asignarla manualmente a la propiedad URL de la clase de proxy del servicio web.Esto debe hacerse antes de llamar al método web.

Si desea utilizar el archivo de configuración, puede configurar el comportamiento de la URL de las clases de proxy en dinámico.

Definitivamente usar la propiedad Url es el camino a seguir.Ya sea configurarlo en app.config, la base de datos o en una tercera ubicación depende de sus necesidades de configuración.A veces no desea que la aplicación se reinicie cuando cambia la ubicación del servicio web.Es posible que no tenga un equilibrador de carga que escale el backend.Es posible que esté solucionando un error en el servicio web.Es posible que su implementación también tenga problemas de configuración de seguridad.Ya sean nombres de usuario y contraseñas de la base de datos de producción o incluso la información de autenticación de seguridad de ws.La separación adecuada de funciones puede permitirle realizar configuraciones más complicadas.

Si agrega una clase contenedora alrededor de las clases generadas por el proxy, puede establecer la propiedad Url de alguna manera unificada cada vez que cree la clase contenedora para llamar a un método web.

explorador de soluciones abiertas

haga clic derecho en el servicio web y cambie el comportamiento de la URL a dinámico

haga clic en el ícono 'mostrar todos los archivos' en el explorador de soluciones

en la referencia web edite el archivo Reference.cs

cambiar constructor

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

Para mí una Referencia a un WebService es un

REFERENCIA DE SERVICIO

.

De todos modos es muy fácil.Como alguien dijo, solo tienes que cambiar la URL en el archivo 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top