¿Cómo puedo cambiar dinámicamente las direcciones del servicio web en .NET sin una recomstackción?

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 son diferentes. La firma del servicio web será la misma en todas las implementaciones, que se encuentra en otro lugar.

Quizás me haya echado a perder el asistente de “Agregar referencia web” de Visual Studio, parece que esto debería ser relativamente fácil.

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

Propiedades de referencia web

Cambiar el valor a dynamic incluirá una entrada en su app.config.

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

Si está estableciendo dinámicamente esto, debe establecer el campo .Url de la instancia de la clase proxy a la que está llamando.

Establecer el valor en el archivo .config desde su progtwig:

  1. Es un lío;

  2. Puede que no se lea hasta que comience la próxima aplicación.

Si solo es algo que se debe hacer una vez por instalación, estaría de acuerdo con los otros carteles y usaré 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 más. La URL de 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. TheService se configuró a través de VS add service reference.

 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 está anulando el constructor, lo cual hice con una statement de clase parcial. Lo anterior, establecer el comportamiento de URL en Dinámico también debe hacerse.

Básicamente, esto crea un contenedor de servicios web donde si tiene que volver a cargar el servicio web en algún momento, a través de agregar una referencia de servicio, no pierde su trabajo. La ayuda de Microsoft para las 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ámico “.

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

En nuestro proyecto, nuestro enfoque simple era simplemente tener las entradas de app.config comentadas por tipo de entorno (desarrollo, prueba, producción). Así que simplemente descomentamos la entrada para el tipo de entorno deseado. No hay encoding especial necesaria allí.

Solo una nota sobre la diferencia entre estático y dynamic.

  • Estático : debe establecer la propiedad URL cada vez que llame al servicio web. Esto porque la URL base si el servicio web está en el constructor de la clase proxy.
  • Dinámico : se creará una clave de configuración especial para usted en su archivo web.config . Por defecto, la clase de proxy leerá la URL de esta clave.

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

Si desea utilizar el archivo de configuración, puede establecer el comportamiento de la URL de las clases proxy en dynamic.

Definitivamente, usar la propiedad Url es el camino a seguir. Ya sea para configurarlo en la aplicación.config, la base de datos o una tercera ubicación, en cierto modo 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 back-end. Es posible que esté aplicando un parche a un error del servicio web. Su implementación también puede tener problemas de configuración de seguridad. Ya sea que se trate de nombres de usuario y contraseñas de producción, o incluso de la información de autenticación de seguridad de ws. La separación adecuada de deberes puede llevarlo a configuraciones de configuración más complicadas.

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

explorador de soldaduras abierto

haga clic derecho en el servicio web cambie el comportamiento de URL a dynamic

haga clic en el icono ‘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 servicio web es una

REFERENCIA DE SERVICIO

.

De todos modos es muy fácil. Como alguien dijo, solo tienes que cambiar la URL en el archivo web.config.

        **** CHANGE THE LINE BELOW TO CHANGE THE URL ****