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 đề, tức là sử dụng OpenMappedMachineConfiguration
dường như mất nhóm phần 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 (tất cả đều là OP mong muốn), nhưng không phải là các phần hệ thống bình thường. Ví dụ, đoạn mã này sẽ không làm việc:
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 một chiếc đồng hồ trên configuration.SectionGroups
, bạn sẽ thấy system.net mà không được đăng ký như một SectionGroup, vì vậy nó là khá nhiều không thể tiếp cận thông qua bình thường kênh truyền hình.
Có hai cách tôi tìm thấy để giải quyết vấn đề này. Đầu tiên, mà tôi không thích, là tái triển khai 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, ví dụ:
<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 chắn chính ứng dụng web sẽ chạy chính xác sau đó, nhưng bạn có thể truy cập phần chính xác.
Giải pháp thứ hai đó là thay vì để mở web.config bạn như là một cấu hình EXE, mà có lẽ gần gũi hơn với chức năng dự định của nó anyway:
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 nói là không ai trong số các câu trả lời cung cấp ở đây, chẳng thuộc về tao hay Ishmaeel's, khá sử dụng các chức năng này như thế nào 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.
Xem http: // stackoverflow.com/questions/3912727/openmappedexeconfiguration-vs-openexeconfiguration/6599688#6599688 –