Câu trả lời của Ishmaeel thường hoạt động, tuy nhiên tôi đã tìm thấy một vấn đề, đó là việc sử dụng OpenMappedMachineConfiguration
dường như làm mất các nhóm phần được kế thừa của bạn từ machine.config. Điều này có nghĩa là bạn có thể truy cập các phần tùy chỉnh của riêng bạn (đó là tất cả những gì OP muốn), nhưng không phải là các phần hệ thống thông thường. Ví dụ: mã này sẽ không hoạt động:
ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns null
Về cơ bản, nếu bạn đặt đồng hồ trên configuration.SectionGroups
, bạn sẽ thấy system.net không được đăng ký dưới dạng Mục nhóm, do đó, nó không thể truy cập được thông qua các kênh thông thường.
Có hai cách tôi tìm thấy để làm việc này. Điều đầu tiên, mà tôi không thích, là triển khai lại các nhóm phần hệ thống bằng cách sao chép chúng từ machine.config vào web.config của riêng bạn, vd
<sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<sectionGroup name="mailSettings" type="System.Net.Configuration.MailSettingsSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="smtp" type="System.Net.Configuration.SmtpSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</sectionGroup>
</sectionGroup>
Tôi không chắc bản thân ứng dụng web sẽ chạy chính xác sau đó, nhưng bạn có thể truy cập chính xác vào nhóm.
Thay vào đó, giải pháp thứ hai là mở web.config dưới dạng cấu hình EXE, có lẽ gần với chức năng dự định của nó hơn:
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = strConfigPath };
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns valid object!
Tôi dám khẳng định không có câu trả lời nào được cung cấp ở đây, cả của tôi và của Ishmaeel, đều sử dụng các chức năng này theo cách mà các nhà thiết kế .NET dự định. Nhưng, điều này dường như làm việc cho tôi.