2010-03-03 32 views
30

Tôi có biểu mẫu giành chiến thắng tạo trang web trong IIS7. Một chức năng cần mở tệp web.config và thực hiện một vài cập nhật. (chuỗi kết nối, smtp, mạo danh)Làm thế nào để OpenWebConfiguration với đường dẫn vật lý?

Tuy nhiên, tôi không có đường dẫn ảo, chỉ là đường dẫn vật lý.

Có cách nào tôi vẫn có thể sử dụng WebConfigurationManager không?

Tôi cần sử dụng khả năng tìm phần và đọc/ghi.

System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration 

Trả lời

60

Bạn sẽ phải ánh xạ PhysicalPath vào tệp virtualPath. Đây là cách bạn sẽ làm điều đó.

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

cảm ơn tôi sẽ thử điều này. – aron

+0

Cảm ơn bạn !! Đây là hoàn hảo. – BigJoe714

+0

cảm ơn bạn rất nhiều bạn đời – codebased

10

câu trả lời Vadim của làm việc rất lớn trên máy chủ dev của chúng tôi, nhưng bị đánh bom trên máy chủ trực tiếp của chúng tôi với thông báo sau:

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

Để khắc phục điều này, tôi tìm thấy một tình trạng quá tải cho WebConfigurationManager.OpenMappedWebConfiguration mà sẽ đưa trang web IIS tên là tham số thứ ba. Kết quả là như sau:

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

Xây dựng về câu trả lời Vadim, tôi tìm thấy những gì ông đã viết không chính xác làm việc cho hoàn cảnh của tôi, vì vậy tôi sử dụng này để thay thế:

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 

Trong trường hợp bất cứ ai khác là cố gắng những gì tôi đang cố gắng và tìm thấy điều này, mục đích của tôi làm điều này là để có được SimpleMembershipProvider, mà kế thừa từ ExtendedMembershipProvider, để làm việc với SQLite. Để làm điều đó, tôi đã tạo các bảng bằng tay mỗi liên kết này: SimpleMembershipProvider in MVC4, và sau đó sử dụng lệnh này trong Global.asax hồ sơ của tôi Application_Start thói quen:

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

nào nó quay ra đã không yêu cầu tôi thực sự viết lại web của tôi .config tập tin ở tất cả. (Cũng có nhiều thay đổi về web.config mà tôi phải làm, nhưng điều đó thậm chí còn vượt ra ngoài phạm vi của câu hỏi này.)

0

Câu trả lời của Vadim chính xác là những gì tôi cần, nhưng tôi đã gặp phải vấn đề tương tự Kieth, và giải pháp của anh ta đã làm được điều đó!

tôi nghĩ rằng tôi muốn thêm mặc dù, rằng tên trang web IIS có thể retrieved by calling:

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

Ngoài ra, mã cjbarth của bao gồm một giải pháp gọn gàng cho những thử nghiệm trong môi trường nơi vị trí của wwwroot và Web.config có thể khác nhau:

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

Vì vậy, với những ghi nhớ một sự cải thiện nhẹ về chức năng Vadim của sẽ đọc:

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); 
    } 
Các vấn đề liên quan