¿Cómo puedo cambiar dinámicamente direcciones de servicio web in.NET ¿sin una recompilación?


Tengo código que hace referencia a un servicio web, y me gustaría que la dirección de ese servicio web sea dinámica (leída desde una base de datos, archivo de configuración, etc.) para que se cambie 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, solo que se encuentra en otro lugar.

Tal vez acabo de ser mimado por el asistente de Visual Studio "Agregar referencia web" - parece esto aunque debería ser algo relativamente fácil.

Author: Luke Girvin, 2008-09-24

11 answers

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

Propiedades de Referencia Web

Cambiar el valor a dinámico pondrá una entrada en tu app.config.

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

 51
Author: Eric Schoonover,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-08 14:08:15

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

Establecer el valor en el .archivo de configuración desde dentro de su programa:

  1. Es un desastre;

  2. Puede que no se lea hasta el siguiente inicio de la aplicación.

Si solo es algo que necesita hacerse una vez por instalación, estaría de acuerdo con los otros carteles y usaría el .archivo de configuración y el ajuste dinámico.

 29
Author: Brad Bruce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-13 18:53:44

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 arriba. 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. El servicio 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();
}
 13
Author: rwg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-30 14:55:33

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 sobreescribir el constructor, lo que hice con una declaración de clase parcial. Lo anterior, establecer el comportamiento de la URL a Dinámico también se debe hacer.

Esto básicamente crea un contenedor de servicio web donde si tiene que recargar el servicio web en algún momento, a través de agregar referencia de servicio, no pierde su trabajo. La ayuda de Microsoft para Partial classes declara especialmente que parte de la razón de esta construcción es crear envoltorios 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;
            }
        }
    }
}
 6
Author: John Kocktoasten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-27 12:51:11

Cambia el comportamiento de URL a " Dinámico".

 5
Author: Gulzar Nazim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-21 08:47:33

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

En nuestro proyecto, nuestro enfoque simple era simplemente tener la aplicación.entradas de configuración comentadas por tipo de entorno (desarrollo, pruebas, producción). Así que solo descomentamos la entrada para el tipo de entorno deseado. No se necesita codificación especial allí.

 4
Author: cruizer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-24 05:33:01

Solo una nota sobre la diferencia entre estática y dinámica.

  • Static: debe establecer 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 clase proxy.
  • Dynamic : se creará una clave de configuración especial para usted en su web.archivo config. Por defecto, la clase proxy leerá la URL de esta clave.
 2
Author: stefano m,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-21 08:50:39

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

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

 2
Author: Aaron Fischer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-10 07:59:42

Definitivamente usar la propiedad Url es el camino a seguir. Si configurarlo en la aplicación.la configuración, la base de datos o un tercer tipo de ubicación depende de sus necesidades de configuración. A veces no quieres que la aplicación se reinicie cuando cambias la ubicación del servicio web. Es posible que no tenga un equilibrador de carga escalando el backend. Es posible que esté parcheando un error de servicio web. Su implementación también podría tener problemas de configuración de seguridad. Ya se trate de nombres de usuario y contraseñas de base de datos de producción o incluso la información de autenticación de seguridad de ws. La separación adecuada de tareas puede llevarlo a algunas configuraciones de configuración más complicadas.

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

 1
Author: mspmsp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-24 15:19:52

Open solition explorer

Haga clic con el botón derecho en el webservice cambiar el comportamiento de URL a Dinámico

Haga clic en el icono 'mostrar todos los archivos' en el explorador de soluciones

En la referencia web edite la Referencia.cs file

Cambiar constructor

public Service1() {
        this.Url = "URL"; // etc. string  variable this.Url = ConfigClass.myURL
      }
 0
Author: mesutpiskin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-22 21:08:23

Para mí una Referencia a un servicio web es un

REFERENCIA DEL SERVICIO

.

De todos modos es muy fácil. Como alguien dijo, solo tienes que cambiar la URL en la web.archivo de configuración.

<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
Author: djciko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-11 16:48:48