Cambiar un web.config mediante programación con C # (.NET)

93

¿Cómo puedo modificar / manipular web.configprogramáticamente con C #? ¿Puedo usar un objeto de configuración y, en caso afirmativo, cómo puedo cargarlo web.configen un objeto de configuración? Me gustaría tener un ejemplo completo cambiando la cadena de conexión. Después de la modificación, se web.configdebe volver a escribir en el disco duro.

Kottan
fuente
Consulte la publicación de su blog sobre cómo manipular web.config mediante programación en ASP.NET 2.0 y ASP.NET 3.5 Alternativamente, consulte esta pregunta que tiene la respuesta para su pregunta. ¿Cómo establezco una configuración de cadena de conexión mediante programación en .net?
Shoban

Respuestas:

115

Aquí hay un código:

var configuration = WebConfigurationManager.OpenWebConfiguration("~");
var section = (ConnectionStringsSection)configuration.GetSection("connectionStrings");
section.ConnectionStrings["MyConnectionString"].ConnectionString = "Data Source=...";
configuration.Save();

Vea más ejemplos en este artículo , es posible que deba echar un vistazo a la suplantación de identidad .

Alex LE
fuente
¿Cuál es el nombre de su cadena de conexión en el archivo web.config?
Alex LE
enlace al artículo roto
Vitall
@AlexLE: ¿Cómo especificamos la ubicación del archivo cuando web.config se coloca en una ubicación diferente? ¿Puede ser un servidor remoto en una ruta compartida?
SharpCoder
@SharpCoder, la ruta es una ruta virtual, por lo que primero necesita copiar el web.config desde el servidor remoto a su aplicación local (dentro de una carpeta temporal para no anular su propio web.config), editarlo, guardarlo y luego volver a copiar al servidor remoto. O una solución mejor y más compleja sería: crear una API que haga el trabajo (cambiar de web.config), implementarla en el servidor remoto y luego consumirla desde el servidor local.
Guilherme Branco Stracini
@Skami debes establecer el nombre de connectionStrings en "MyConnectionString", eso significa sección.ConnectionStrings ["MyConnectionString"] el valor debe coincidir con el nombre.
Liakat
12
Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
ConnectionStringsSection section = config.GetSection("connectionStrings") as ConnectionStringsSection;
//section.SectionInformation.UnprotectSection();
section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
config.Save();
ASergan
fuente
¿Cómo obtener el ID de usuario de la variable de sección?
Niks
5

Dado que el archivo web.config es un archivo xml, puede abrir web.config usando la clase xmldocument. Obtenga el nodo de ese archivo xml que desea actualizar y luego guarde el archivo xml.

aquí hay una URL que explica con más detalle cómo puede actualizar el archivo web.config mediante programación.

http://patelshailesh.com/index.php/update-web-config-programmatic

Nota: si realiza algún cambio en web.config, ASP.NET detecta esos cambios y volverá a cargar su aplicación (reciclar el grupo de aplicaciones) y el efecto de eso es que los datos guardados en Sesión, Aplicación y Caché se perderán (asumiendo el estado de la sesión es InProc y no utiliza un servidor estatal o una base de datos).

Shailesh
fuente
Sé que es técnicamente posible, creo que es probable que el método sancionado / aprobado por Microsoft sea más duradero y esté menos sujeto a romper el web.config. Todos hemos actualizado estos archivos "a mano", pero creo que es arriesgado con los servidores web de producción. Solo mi 2c.
Anthony Horne
2

Este es un método que utilizo para actualizar AppSettings, funciona tanto para aplicaciones web como de escritorio. Si necesita editar connectionStrings, puede obtener ese valor System.Configuration.ConnectionStringSettings config = configFile.ConnectionStrings.ConnectionStrings["YourConnectionStringName"];y luego establecer un nuevo valor con config.ConnectionString = "your connection string";. Tenga en cuenta que si tiene algún comentario en la connectionStringssección, Web.Configestos serán eliminados.

private void UpdateAppSettings(string key, string value)
{
    System.Configuration.Configuration configFile = null;
    if (System.Web.HttpContext.Current != null)
    {
        configFile =
            System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
    }
    else
    {
        configFile =
            ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    }
    var settings = configFile.AppSettings.Settings;
    if (settings[key] == null)
    {
        settings.Add(key, value);
    }
    else
    {
        settings[key].Value = value;
    }
    configFile.Save(ConfigurationSaveMode.Modified);
    ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
}
Ogglas
fuente
Este código es bueno y lo voté a favor, pero no funcionará si appSettings se define en otro archivo, como por ejemplo: <appSettings file = "C: \ Client \ customSettings.config"> </appSettings>
Ben Junior