我有一个胜利的形式,在IIS7中创建一个网站。 一个功能需要打开web.config文件并进行一些更新。 (连接字符串,smtp,模拟)如何使用物理路径打开Web配置?
但是我没有虚拟路径,只是物理路径。
有没有什么办法可以使用WebConfigurationManager?
我需要使用它的能力来查找部分和读/写。
System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration
我有一个胜利的形式,在IIS7中创建一个网站。 一个功能需要打开web.config文件并进行一些更新。 (连接字符串,smtp,模拟)如何使用物理路径打开Web配置?
但是我没有虚拟路径,只是物理路径。
有没有什么办法可以使用WebConfigurationManager?
我需要使用它的能力来查找部分和读/写。
System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration
您必须将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, "/");
}
瓦迪姆的回答工作我们的开发服务器上伟大的,但轰炸我们用下面的消息活的服务器上:
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");
}
大厦瓦迪姆的答案,我发现他写的东西并没有完全对我的情况下工作,所以我用这个来代替:
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我必须做的更改,但是这个问题甚至超出了这个问题的范围。)
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);
}
谢谢我会试试这个。 – aron 2010-03-19 12:14:05
谢谢!太棒了。 – BigJoe714 2011-08-18 14:00:46
非常感谢你的伴侣 – codebased 2014-11-18 01:24:45