คำตอบของอิชมาเอลโดยทั่วไปใช้งานได้ แต่ฉันพบปัญหาหนึ่งนั่นคือการใช้OpenMappedMachineConfiguration
ดูเหมือนว่าจะสูญเสียกลุ่มส่วนที่สืบทอดมาจาก machine.config ซึ่งหมายความว่าคุณสามารถเข้าถึงส่วนที่กำหนดเองได้ (ซึ่งเป็น OP ทั้งหมดที่ต้องการ) แต่ไม่ใช่ส่วนของระบบปกติ ตัวอย่างเช่นรหัสนี้จะไม่ทำงาน:
ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns null
โดยทั่วไปหากคุณใส่นาฬิกาconfiguration.SectionGroups
คุณจะเห็นว่า system.net ไม่ได้ลงทะเบียนเป็น SectionGroup ดังนั้นจึงไม่สามารถเข้าถึงได้ผ่านช่องทางปกติ
มีสองวิธีที่ฉันพบในการแก้ไขปัญหานี้ สิ่งแรกที่ฉันไม่ชอบคือการนำกลุ่มส่วนระบบมาใช้ใหม่โดยคัดลอกจาก machine.config ลงใน web.config ของคุณเองเช่น
<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>
ฉันไม่แน่ใจว่าเว็บแอปพลิเคชันจะทำงานอย่างถูกต้องหลังจากนั้น แต่คุณสามารถเข้าถึง sectionGroups ได้อย่างถูกต้อง
วิธีที่สองคือการเปิด web.config ของคุณเป็นการกำหนดค่า EXE แทนซึ่งอาจใกล้เคียงกับฟังก์ชันที่ต้องการมากขึ้น:
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!
ฉันไม่กล้าตอบคำตอบที่นี่ทั้งของฉันหรือของอิชมาเอลต่างก็ใช้ฟังก์ชันเหล่านี้ตามที่นักออกแบบ. NET ตั้งใจไว้ แต่ดูเหมือนว่าจะได้ผลสำหรับฉัน