2010-03-03 35 views
30

我有一个胜利的形式,在IIS7中创建一个网站。 一个功能需要打开web.config文件并进行一些更新。 (连接字符串,smtp,模拟)如何使用物理路径打开Web配置?

但是我没有虚拟路径,只是物理路径。

有没有什么办法可以使用WebConfigurationManager?

我需要使用它的能力来查找部分和读/写。

System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration 

回答

60

您必须将physicalPath映射到虚拟路径。这是你将如何做到这一点。

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

谢谢我会试试这个。 – aron 2010-03-19 12:14:05

+0

谢谢!太棒了。 – BigJoe714 2011-08-18 14:00:46

+0

非常感谢你的伴侣 – codebased 2014-11-18 01:24:45

10

瓦迪姆的回答工作我们的开发服务器上伟大的,但轰炸我们用下面的消息活的服务器上:

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

为了解决这个问题,我发现WebConfigurationManager.OpenMappedWebConfiguration另一个重载需要的IIS网站名称作为第三个参数。结果如下:

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

大厦瓦迪姆的答案,我发现他写的东西并没有完全对我的情况下工作,所以我用这个来代替:

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 

万一别人是尝试我正在尝试的并发现这一点,我这样做的目的是获得SimpleMembershipProvider(继承自ExtendedMembershipProvider)与SQLite一起工作。要做到这一点,我手动创建的表每此链接:SimpleMembershipProvider in MVC4,然后在使用该命令我Global.asax文件的Application_Start常规:

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

它原来没有要求我居然重新写我的网页.config文件。 (也有很多web.config我必须做的更改,但是这个问题甚至超出了这个问题的范围。)

0

Vadim的回答正是我所需要的,但是我遇到了同样的问题基斯,他的解决方案做到了!

我想我虽然增加,使IIS网站名称可以是retrieved by calling

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

此外,cjbarth的代码中包含了对环境的测试整洁的解决方案,其中wwwroot文件和Web.config中的位置可以有所不同:

System.Web.HttpContext.Current.Server.MapPath("~"); 
这些考虑

因此,对瓦迪姆的功能的另一略有改善将是:

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