บทนำ
เมื่อทำงานกับ Windows Communication Foundation (WCF) ใน C# นักพัฒนามักต้องการเข้าถึงการตั้งค่าการกำหนดค่าที่เฉพาะเจาะจงซึ่งกำหนดไว้ในไฟล์ App.config ของแอปพลิเคชัน โดยข้อกำหนดทั่วไปคือการเข้าถึงการกำหนดค่าของ system.serviceModel
อย่างไรก็ตาม หลายคนพบปัญหาที่การเข้าถึงส่วนที่หวังไว้กลับคืนมาเป็น null เมื่อเข้าถึงผ่าน ConfigurationManager
โพสต์บล็อกนี้พิจารณาปัญหานี้และให้คำแนะนำในการแก้ปัญหารายละเอียด
ปัญหา
ความท้าทายเกิดขึ้นจากโครงสร้างของการกำหนดค่าโมเดลบริการ WCF นักพัฒนาอาจสังเกตว่าขณะพยายามดึงข้อมูลส่วน system.serviceModel
โดยใช้โค้ดต่อไปนี้:
var serviceModelSection = ConfigurationManager.GetSection("system.serviceModel");
พวกเขาจะได้รับ null
อย่างไรก็ตามเมื่อสอบถามส่วนที่แตกต่างออกไป เช่น appSettings
มันทำงานได้อย่างสมบูรณ์:
var appSettingsSection = ConfigurationManager.GetSection("appSettings");
ปัญหานี้แสดงให้เห็นว่ามีความเข้าใจผิดในวิธีการโหลดส่วนการกำหนดค่าในแอปพลิเคชัน WCF
วิธีแก้ปัญหา
เพื่อโหลดส่วนการกำหนดค่าของ system.serviceModel
อย่างแท้จริง คุณจะต้องใช้วิธีการที่แตกต่าง นี่คือวิธีการทำ:
การเข้าใจกลุ่มการกำหนดค่า
องค์ประกอบ system.serviceModel
ในไฟล์การกำหนดค่าแสดงถึง กลุ่มส่วนการกำหนดค่า ไม่ใช่แค่ส่วนเดียว การแบ่งแยกความแตกต่างนี้มีความสำคัญเพราะการพยายามเข้าถึงมันโดยใช้ ConfigurationManager.GetSection
จะไม่ให้ผลลัพธ์ที่ต้องการ
การใช้วิธีที่ถูกต้อง
แทนที่จะดึงส่วนโดยตรง คุณควรใช้คลาส ServiceModelSectionGroup
เพื่อดึงกลุ่มการกำหนดค่าทั้งหมด:
var serviceModelGroup = System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None));
- ขั้นตอนที่ 1: เรียกใช้
GetSectionGroup()
บนServiceModelSectionGroup
โดยส่งการกำหนดค่าปัจจุบันของแอปพลิเคชันของคุณ - ขั้นตอนที่ 2: เข้าถึงการตั้งค่าเฉพาะจาก
serviceModelGroup
ที่ส่งคืน
ตัวอย่าง: การเข้าถึง Service Endpoint
นี่คือตัวอย่างเกี่ยวกับวิธีที่คุณสามารถดึงที่อยู่ของ service endpoint จากการกำหนดค่า:
var serviceModelGroup = System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None));
if (serviceModelGroup != null)
{
var endpointAddress = serviceModelGroup.Client.Endpoints[0].Address.ToString();
Console.WriteLine($"Service Endpoint Address: {endpointAddress}");
}
else
{
Console.WriteLine("ServiceModelSectionGroup is null.");
}
ข้อคิดสำคัญ
- ขอให้จำไว้ว่าการกำหนดค่าของ
system.serviceModel
เป็นกลุ่ม ส่วน ไม่ใช่แค่ส่วนเดียว - ใช้
ServiceModelSectionGroup.GetSectionGroup()
เพื่อดึงข้อมูลการกำหนดค่าของ WCF - วิธีนี้ช่วยป้องกันการใช้วิธีที่ไม่ได้มาตรฐานซึ่งเกี่ยวข้องกับการโหลดแฟ้มกำหนดค่าแบบแมนนวลหรือ XPath
สรุป
การเข้าถึงการกำหนดค่าของ system.serviceModel
ในแอปพลิเคชัน C# .NET สามารถทำได้อย่างง่ายดายเมื่อคุณเข้าใจโครงสร้างของส่วนและกลุ่มการกำหนดค่า โดยการใช้ ServiceModelSectionGroup
คุณสามารถดึงข้อมูลการตั้งค่า WCF ที่จำเป็นได้โดยไม่ต้องเผชิญกับการอ้างอิงที่เป็น null วิธีนี้เสนอแนวทางที่สะอาดและมีความทนทานมากขึ้นในการจัดการการกำหนดค่า WCF ภายในแอปพลิเคชันของคุณ
สำหรับรายละเอียดเพิ่มเติม โปรดตรวจสอบเอกสารอย่างเป็นทางการได้ที่ Microsoft Docs.
ขอให้เขียนโค้ดให้สนุก!