2010-03-03 17 views
30

Tengo un formulario de ganar que crea un sitio en IIS7. Una función necesita abrir el archivo web.config y realizar algunas actualizaciones. (cadena de conexión, smtp, suplantación)¿Cómo abrir la configuración web con la ruta física?

Sin embargo, no tengo la ruta virtual, solo la ruta física.

¿Hay alguna manera de que todavía pueda usar WebConfigurationManager?

Necesito usar su capacidad para buscar secciones y leer/escribir.

System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration 

Respuesta

60

Deberá asignar el physicalPath a un VirtualPath. Aquí es cómo lo harías.

using System.Web.Configuration; //Reference the System.Web DLL (project needs to be using .Net 4.0 full, not client framework) 

public static Configuration OpenConfigFile(string configPath) 
{ 
    var configFile = new FileInfo(configPath); 
    var vdm = new VirtualDirectoryMapping(configFile.DirectoryName, true, configFile.Name); 
    var wcfm = new WebConfigurationFileMap(); 
    wcfm.VirtualDirectories.Add("/", vdm); 
    return WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/"); 
} 
+0

gracias Voy a intentar esto. – aron

+0

¡Gracias! Esto es perfecto. – BigJoe714

+0

muchas gracias amigo – codebased

10

respuesta de Vadim funcionó muy bien en nuestro servidor dev, pero bombardeada en nuestro servidor en vivo con el siguiente mensaje:

System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. Parameter name: site 

Para corregir esto, he encontrado otra sobrecarga para WebConfigurationManager.OpenMappedWebConfiguration que se lleva a la página web de IIS nombre como el tercer parámetro. El resultado es el siguiente:

public static Configuration OpenConfigFile(string configPath) 
{ 
    var configFile = new FileInfo(configPath); 
    var vdm = new VirtualDirectoryMapping(configFile.DirectoryName, true, configFile.Name); 
    var wcfm = new WebConfigurationFileMap(); 
    wcfm.VirtualDirectories.Add("/", vdm); 
    return WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/", "iis_website_name"); 
} 
0

Sobre la base de la respuesta de Vadim, me encontré con lo que escribió no funcionó exactamente para mi situación, por lo que utiliza en su lugar:

Dim connectionSettings As New ConnectionStringSettings("mySQLite", ConnectionStringHelper.MyConnectionString) 

Dim dummyVirtualPath As String = "/MyApp" 
Dim virtualDirMap = New VirtualDirectoryMapping(Server.MapPath("~"), True) 
Dim webConfigFileMap = New WebConfigurationFileMap() 
webConfigFileMap.VirtualDirectories.Add(dummyVirtualPath, virtualDirMap) 
Dim mappedConfigFile = WebConfigurationManager.OpenMappedWebConfiguration(webConfigFileMap, dummyVirtualPath) 

Dim config As System.Configuration.Configuration = mappedConfigFile WebConfigurationManager.OpenWebConfiguration(Server.MapPath("~") & "/") 
Dim csSection As ConnectionStringsSection = config.ConnectionStrings 

If csSection.ConnectionStrings("mySQLite") IsNot Nothing AndAlso csSection.ConnectionStrings("mySQLite").ConnectionString <> connectionSettings.ConnectionString Then 
    csSection.ConnectionStrings("mySQLite").ConnectionString = connectionSettings.ConnectionString 
    config.Save() 
    ConfigurationManager.RefreshSection(csSection.SectionInformation.Name) 
End If 

En caso de que alguien más está probando lo que estoy intentando y descubriendo esto, el propósito de hacer esto fue obtener SimpleMembershipProvider, que hereda de ExtendedMembershipProvider, para trabajar con SQLite. Para hacer eso, he creado las tablas manualmente por este enlace: SimpleMembershipProvider in MVC4, y luego se usa este comando en mi Global.asax de archivo Application_Start rutina:

WebSecurity.InitializeDatabaseConnection(ConnectionStringHelper.MyConnectionString, "System.Data.SQLite", "Users", "UserID", "Email", False) 

cual resulta que no requería que yo en realidad re-escribir mi web archivo .config en absoluto. (También hubo muchos cambios de web.config que tuve que hacer, pero eso está aún más fuera del alcance de esta pregunta.)

0

La respuesta de Vadim era exactamente lo que necesitaba, pero me encontré con el mismo problema Kieth, y su solución hizo el truco!

pensé que me gustaría añadir, sin embargo, que el Nombre del sitio web de IIS puede ser retrieved by calling:

System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName(); 

Además, el código de cjbarth incluyó una solución ordenada para aquellos entornos en los que las pruebas en el lugar de wwwroot y Web.config puede variar:

System.Web.HttpContext.Current.Server.MapPath("~"); 

Así que con esto en mente otra ligera mejora en la función de Vadim sería el siguiente:

public static Configuration GetWebConfig() { 
     var webConfigFile = new FileInfo("Web.config"); 
     var wwwRootPath = HttpContext.Current.Server.MapPath("~"); 
     var vdm = new VirtualDirectoryMapping(wwwRootPath, true, webConfigFile.Name); 
     var wcfm = new WebConfigurationFileMap(); 
     wcfm.VirtualDirectories.Add("/", vdm); 
     var siteName = HostingEnvironment.ApplicationHost.GetSiteName(); 
     return WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/", siteName); 
    } 
Cuestiones relacionadas