web-dev-qa-db-fra.com

Comment OpenWebConfiguration avec un chemin physique?

J'ai un formulaire gagnant qui crée un site dans IIS7. Une fonction doit ouvrir le fichier web.config et effectuer quelques mises à jour. (chaîne de connexion, smtp, emprunt d'identité)

Cependant, je n'ai pas le chemin virtuel, juste le chemin physique.

Existe-t-il un moyen de continuer à utiliser WebConfigurationManager?

Je dois utiliser sa capacité à trouver des sections et à lire/écrire.

System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration
31
aron

Vous devrez mapper le physicalPath à un virtualPath. Voici comment vous feriez cela.

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

La réponse de Vadim a très bien fonctionné sur notre serveur de développement, mais a bombardé notre serveur en direct avec le message suivant:

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

Pour corriger cela, j'ai trouvé une autre surcharge pour WebConfigurationManager.OpenMappedWebConfiguration qui prend comme troisième paramètre le nom de site Web IIS. Le résultat est le suivant:

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");
}
10
Keith

En me basant sur la réponse de Vadim, j'ai trouvé que ce qu'il avait écrit ne fonctionnait pas exactement dans mon cas, alors j'ai utilisé ceci à la place:

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

Si quelqu'un d'autre essaye ce que j'essaie et trouve ceci, le but de mon travail était d'obtenir SimpleMembershipProvider, qui hérite de ExtendedMembershipProvider, pour travailler avec SQLite. Pour ce faire, j'ai créé les tables manuellement via ce lien: SimpleMembershipProvider dans MVC4 , puis ai utilisé cette commande dans la routine Global.asax de mon fichier Application_Start:

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

Il s’est avéré que je n’ai pas du tout dû réécrire mon fichier web.config. (Il y avait aussi beaucoup de changements dans web.config que je devais faire, mais cela dépasse encore le cadre de cette question.)

0
cjbarth

La réponse de Vadim était exactement ce dont j'avais besoin, mais je suis tombé sur le même problème que Kieth, et sa solution a fait l'affaire!

Je pensais ajouter cependant que le IIS nom de site Web peut être récupéré en appelant :

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

De plus, le code de cjbarth incluait une solution ordonnée pour les tests dans des environnements où l'emplacement de wwwroot et Web.config peut varier:

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

Donc, gardant cela à l’esprit, une autre légère amélioration de la fonction de Vadim se lirait comme suit:

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