Pregunta

Tengo una forma triunfo que crea un sitio en IIS7. Una función tiene que abrir el archivo web.config y hacer algunos cambios. (Cadena de conexión, smtp, suplantación)

Sin embargo, yo no tengo la ruta de acceso virtual, sólo la ruta física.

¿Hay alguna manera que todavía puedo utilizar WebConfigurationManager?

Qué necesito para utilizar su capacidad de encontrar y la sección de lectura / escritura.

System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration
¿Fue útil?

Solución

Usted tendrá que asignar el physicalPath a un virtualPath. Aquí es cómo se haría eso.

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

Otros consejos

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

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

Para corregir esto, me encontré con otra sobrecarga para WebConfigurationManager.OpenMappedWebConfiguration que lleva el nombre del sitio web de IIS como tercer parámetro. El resultado es como sigue:

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, he encontrado lo que escribió lo hizo no es exactamente el trabajo de 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 el caso de cualquier otra persona está tratando de lo que estoy tratando y se encuentra presente, el propósito de mi hacer esto era conseguir SimpleMembershipProvider, que hereda de ExtendedMembershipProvider, para trabajar con SQLite. Para hacer eso, he creado las tablas manualmente por este enlace: SimpleMembershipProvider en MVC4 , y luego se usa este comando en la rutina Global.asax de mi archivo Application_Start:

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

Lo cual resulta que no me requiere para realmente volver a escribir mi archivo web.config en absoluto. (También hubo una gran cantidad de cambios de web.config que tenía que hacer, pero que es aún más fuera del alcance de esta pregunta.)

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 me gustaría añadir, sin embargo, que el nombre de IIS sitio web puede ser recuperada llamando :

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

Además, el código de cjbarth incluyó una solución ordenada para aquellos ensayos en entornos donde la ubicación 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);
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top