c#-3.0 web-config webconfigurationmanager virtual-path

c# 3.0 - ¿Cómo OpenWebConfiguration con la ruta física?



c#-3.0 web-config (4)

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, "/"); }

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)

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

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

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

System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration


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

Pensé que agregaría, sin embargo, que el nombre del sitio web de IIS se puede recuperar llamando :

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

Además, el código de cjbarth incluía una solución ordenada para las pruebas en entornos donde la ubicación de wwwroot y Web.config puede variar:

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

Entonces con esto en mente, otra ligera mejora en la función de Vadim sería:

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); }


La respuesta de Vadim funcionó muy bien en nuestro servidor de desarrollo, pero fue 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, encontré otra sobrecarga para WebConfigurationManager.OpenMappedWebConfiguration que toma el nombre del sitio web de IIS 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"); }


Sobre la base de la respuesta de Vadim, encontré que lo que escribió no funcionaba exactamente para mi situación, así que usé esto 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 intente lo que estoy intentando y encuentre esto, el objetivo de esto fue conseguir que SimpleMembershipProvider , que hereda de ExtendedMembershipProvider , funcione con SQLite. Para hacer eso, creé las tablas manualmente por este enlace: SimpleMembershipProvider en MVC4 , y luego usé este comando en la rutina Application_Start mi archivo Global.asax :

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

Lo cual resultó que no requería que volviera a escribir mi archivo web.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).