Pregunta

Es posible modificar la connectionstrings definidos en la aplicación.config/web.de configuración en tiempo de ejecución?Quiero usar los diferentes configfiles dependiendo de la máquina de la aplicación/sitio se ejecuta en (sólo para propósitos de depuración, por supuesto.Vamos a utilizar de forma regular de los archivos de configuración cuando se implementa).

Puedo escribir AppSettings, pero no ConnectionStrings (AFAIK).O puedo?

¿Fue útil?

Solución

Sí, es posible, pero que yo sepa sólo a través de la reflexión. El siguiente código debe hacer lo que tiene (lea a continuación para el uso):

public static string SetConnectionString(Type assemblyMember,
                                         Type settingsClass,
                                         string newConnectionString,
                                         string connectionStringKey)
{
  Type typSettings = Type.GetType(Assembly.CreateQualifiedName(assemblyMember.Assembly.FullName, settingsClass.FullName));

  if (typSettings == null)
  {
    return null;
  }

  PropertyInfo prpDefault = typSettings.GetProperty("Default", BindingFlags.Static | BindingFlags.Public);

  if (prpDefault == null)
  {
    return null;
  }

  object objSettings = prpDefault.GetValue(null, null);

  if (objSettings == null)
  {
    return null;
  }

  // the default property, this[], is actually named Item
  PropertyInfo prpItem = objSettings.GetType().GetProperty("Item", BindingFlags.Instance | BindingFlags.Public);

  if (prpItem == null)
  {
    return null;
  }

  object[] indexerName = { connectionStringKey };
  string oldConnectionString = (string)prpItem.GetValue(objSettings, indexerName);

  prpItem.SetValue(objSettings, newConnectionString, indexerName);

  return oldConnectionString;
}

assemblyMember es el tipo de llamada
settingsClass es el tipo de su clase configuración
newConnectionString es la cadena completa para establecer
connectionStringKey es el nombre de la cadena de conexión que ha definido en la configuración de tu aplicación

Debe llamar a este método tan pronto como sea posible después de su aplicación se ha iniciado, preferentemente en el método Main ().

Otros consejos

He intentado esto una vez en mi proyecto para propósitos de depuración, pero no pudo hacerlo, el problema (supongo, me corrija si estoy equivocado) está en aplicación poner en marcha el app.config se carga en la memoria, cualquier cambio en app.config mientras la aplicación se está ejecutando no quedar reflejada.

Para superar esto aquí es lo que hice, definir todas las connectionStrings en el app.config y luego llamar a los que usted quiere cuando el programa se ejecuta como este.

, por ejemplo, supongamos que ha definido sus connectionStrings en el app.config de la siguiente manera.

<connectionStrings>
    <add name="YourNameSpace.Properties.Settings.ConnectionString_1"
        connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data  
        Source=|DataDirectory|\file.mdb"
        providerName="System.Data.OleDb"/>

    <add name="YourNameSpace.Properties.Settings.ConnectionString_2"
        connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data  
        Source=|DataDirectory|\file.mdb"
        providerName="System.Data.OleDb"/>

</connectionStrings>

definir tantos como se desee (que está depurando :-) derecha) a continuación, llamar a los parámetros de conexión en el código de hacer algo como esto:

YourNameSpace.Properties.Settings foo = nuevos YourNameSapce.Properties.Settings ();

foo.ConnectionString_1;

HTH

Saludos

@nand

P.S:. Esta respuesta es específica para C #

No se puede editar el archivo de configuración del proceso en ejecución.

Una de las opciones (con pros y contras) es utilizar los datos de configuración en el machine.config o el web.config principal (para el "sitio", se utilizan los nodos "localización") - no es una opción a precipitarse en, aunque .

Una mejor manera de manejar esto es cambiar el archivo de configuración como parte de su estructura / proceso, a ser posible desplegar automatizado. De esta manera, todo es autónomo, y se puede "robocopy" a un servidor de vainilla y hacer que funcione.


Re su "por desarrollador" punto; He descubierto que la manera más fácil de hacer esto era estandarizar la configuración, y ajustar las máquinas. Por ejemplo, se corre un servidor web local en una máquina virtual; en lugar de código con cada máquina, estandarizamos en "LocalServer" (al espejo "localhost"), y añadir un registro DNS local para cada máquina que el desarrollador puede controlar. Tenga en cuenta que esto requiere direcciones IP fijas (o tal vez una reserva DHCP) para evitar que cambia en el tiempo!

bases de datos Ditto; servidores locales pueden utilizar ""; servidores remotos se pueden crear alias en la máquina, por lo que los puntos "devserver" a lo que el usuario desea.

Es sólo una idea ...

Usted podría ejecutar xmlpoke en un NAnt guión a la hora de instalar el sitio web.

E. g.

  1. Implementar el NAnt con el sitio web.
  2. Crear una vaya.el palo que se llama NAnt que se instala en el sitio y no xmlpoke para modificar el web.config con ajustes basados en el nombre del servidor o de algún otro parámetro.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top