บทนำ

เมื่อทำงานกับ 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.

ขอให้เขียนโค้ดให้สนุก!