2009-02-04 17 views
23

Tengo una aplicación de consola que se ejecuta en la misma computadora que aloja un grupo de archivos web.config. Necesito que la aplicación de la consola abra cada archivo web.config y descifre la cadena de conexión y luego pruebe si la cadena de conexión funciona.Abra web.config desde la aplicación de consola?

El problema al que me estoy enfrentando es que OpenExeConfiguration espera un archivo de configuración de la aplicación winforms (app.dll.config) y OpenWebConfiguration necesita ejecutarse a través de IIS. Como esta es mi máquina local, no estoy ejecutando IIS (uso el servidor integrado de Visual Studio).

¿Hay alguna manera de abrir los archivos web.config al mismo tiempo conseguir la robustez de las capacidades de .NET para descifrar los connectionStrings?

Gracias

Actualizar El OpenWebConfiguration funciona si se está consultando IIS directa o eres el sitio web en cuestión que desea buscar el web.config. Lo que quiero lograr es el mismo tipo de funcionalidad, pero desde una aplicación de consola que abre el archivo web.config de un sitio web en mi misma máquina sin usar una consulta IIS porque IIS no se está ejecutando en mi máquina.

+0

Solo una nota al margen, si sus cadenas de conexión aprovechan las conexiones confiables mediante el uso de una identidad de grupo de aplicaciones, este método probablemente no funcionará. Si no está utilizando conexiones de confianza, ¡qué vergüenza! :) – willasaywhat

+1

@Abyss Si se utilizan conexiones de confianza, no tiene sentido encriptarlas. No siempre es posible usar Trusted (es decir, dominio cruzado, política, host externo) –

+0

Hola a todos, No hay conexiones confiables. Situación de dominio cruzado – Josh

Respuesta

38

Ok lo tengo ... compilado y se accede a esta, así que sé que funciona ...

 VirtualDirectoryMapping vdm = new VirtualDirectoryMapping(@"C:\test", true); 
      WebConfigurationFileMap wcfm = new WebConfigurationFileMap(); 
      wcfm.VirtualDirectories.Add("/", vdm); 


      // Get the Web application configuration object. 
      Configuration config = WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/"); 

      ProtectSection(config, @"connectionStrings", "DataProtectionConfigurationProvider"); 

Esto es suponiendo que usted tiene un archivo llamado web.config en un directorio llamado C: \ Prueba.

ajusté @ métodos de Dillie-O para tomar una configuración como parámetro.

También debe hacer referencia a System.Web y System.Configuration y cualquier DLL que contienen los manejadores de configuración que se instalan en su web.config.

+0

¡Dulce! Gracias por la ayuda ~ – Josh

+0

Solo menciono esto porque eres nuevo (por los puntos que tienes) también puedes votar mi respuesta además de marcarla correctamente. –

+0

Exactamente lo que necesitaba, ¡gracias! – Alex

3

La clase cuando la cuchara ConfigurationManager una sección del archivo de configuración, que tiene una propiedad "IsProtected" que se puede inferir de una sección determinada que agarrar. Si está protegido, puede Desprotegerlo usando algún código.

El método básico para cifrar/descifrar dice así (tomado de enlace de artículo siguiente):

private void ProtectSection(string sectionName, string provider) 
{ 
    Configuration config = 
     WebConfigurationManager. 
      OpenWebConfiguration(Request.ApplicationPath); 

    ConfigurationSection section = 
       config.GetSection(sectionName); 

    if (section != null && 
       !section.SectionInformation.IsProtected) 
    { 
     section.SectionInformation.ProtectSection(provider); 
     config.Save(); 
    } 
} 

private void UnProtectSection(string sectionName) 
{ 
    Configuration config = 
     WebConfigurationManager. 
      OpenWebConfiguration(Request.ApplicationPath); 

    ConfigurationSection section = 
       config.GetSection(sectionName); 

    if (section != null && 
      section.SectionInformation.IsProtected) 
    { 
     section.SectionInformation.UnprotectSection(); 
     config.Save(); 
    } 
} 

Salida this article de todos los detalles sobre cómo trabajar con esto.

+0

Hola, Entiendo cómo probar las secciones protegidas, el problema es que estoy tratando de abrir un archivo web.config desde una aplicación de consola. El ejemplo que proporcionó muestra una aplicación web que abre su propio archivo web.config. – Josh

+0

+1 tarde en la llegada, ya que usé los métodos que enviaste en tu respuesta parece que debería darte un voto positivo. –

0

creo que desea utilizar la clase WebConfigurationManager con su método OpenWebConfiguration.

Se necesita una ruta de acceso al web.config y debe abrirlo al igual que lo haría en una aplicación basada en HttpContext.

0
public static string WebKey(string key) 
    { 

     var configFile = new System.IO.FileInfo(webconfigPath); 
     var vdm = new VirtualDirectoryMapping(configFile.DirectoryName, true, configFile.Name); 
     var wcfm = new WebConfigurationFileMap(); 
     wcfm.VirtualDirectories.Add("/", vdm); 
     System.Configuration.Configuration config = WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/"); 
     System.Configuration.AppSettingsSection appSettingSection = (System.Configuration.AppSettingsSection)config.GetSection("appSettings"); 
     System.Configuration.KeyValueConfigurationElement kv = appSettingSection.Settings.AllKeys 
         .Where(x => x.Equals(key)) 
         .Select(x => appSettingSection.Settings[key]) 
         .FirstOrDefault(); 

     return kv != null ? kv.Value : string.Empty; 

    } 
+0

Puede agregar algunas descripciones para sus códigos, esto nos ayudará a entender bien su solución. – Sphinx

Cuestiones relacionadas