2010-03-03 52 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); 
    }