การดีบักข้อผิดพลาดของ WCF Web Service: เคล็ดลับและเครื่องมือที่คุณต้องการ
การสร้างบริการ Windows Communication Foundation (WCF) สามารถเป็นประสบการณ์ที่ดี แต่ก็มักจะมีความท้าทายเฉพาะที่ตามมา หนึ่งในปัญหาที่พบบ่อยที่สุดที่นักพัฒนาพบคือปัญหาที่เกี่ยวข้องกับข้อผิดพลาดที่ปลายทางของบริการ หากคุณเคยได้รับข้อความข้อผิดพลาดเช่นข้อความด้านล่าง คุณจะรู้ว่ามันน่าผิดหวังเพียงใด
ข้อความข้อผิดพลาด:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<s:Fault>
<faultcode
xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">
a:ActionNotSupported
</faultcode>
<faultstring xml:lang="en-GB">
ข้อความที่มี Action '' ไม่สามารถประมวลผลได้ที่ตัวรับ
เนื่องจากความไม่ตรงกันของ ContractFilter ที่ EndpointDispatcher
ซึ่งอาจเกิดจากความไม่ตรงกันของสัญญาซึ่งกันและกัน (Actions ที่ไม่ตรงกันระหว่างผู้ส่งและผู้รับ) หรือ
ความไม่ตรงกันในวิธีการเชื่อมต่อ/ความปลอดภัยระหว่างผู้ส่งและผู้รับ ตรวจสอบให้แน่ใจว่าผู้ส่งและผู้รับมีสัญญาเดียวกันและการเชื่อมต่อเดียวกัน (รวมถึงข้อกำหนดความปลอดภัย เช่น Message, Transport, None).
</faultstring>
</s:Fault>
</s:Body>
</s:Envelope>
ข้อความแสดงข้อผิดพลาดนี้บ่งชี้ถึงปัญหาซ่อนเร้นบางอย่าง มาลงลึกถึงวิธีที่คุณสามารถดีบักข้อผิดพลาด WCF ประเภทนี้ได้อย่างมีประสิทธิภาพและทำให้บริการของคุณทำงานได้อย่างราบรื่น
การเข้าใจปัญหา
ก่อนที่เราจะไปที่เคล็ดลับการดีบัก มาแตกส่วนสำคัญของปัญหาที่คุณอาจพบ:
- ความไม่ตรงกันของ Contract Filter: มักเกิดขึ้นเมื่อมีความแตกต่างระหว่าง Actions ที่คาดหวังซึ่งกำหนดไว้ในสัญญาของบริการ WCF กับ Actions ที่ส่งโดยคลินต์
- ความไม่ตรงกันของ Binding/ความปลอดภัย: ปัญหานี้เกิดขึ้นหากคลินต์และบริการไม่มีการตั้งค่าที่ตรงกันเกี่ยวกับวิธีการเชื่อมต่อ (เช่น HTTP, TCP เป็นต้น) หรือข้อกำหนดความปลอดภัย (เช่น ความปลอดภัยระดับข้อความหรือระดับการขนส่ง)
การทราบถึงความไม่ตรงกันเหล่านี้จะช่วยในการแปลงค่าที่มาของปัญหาให้แคบลง
เคล็ดลับสำหรับการดีบักที่มีประสิทธิภาพ
เพื่อแก้ไขข้อยกเว้นอย่างมีประสิทธิภาพพิจารณากลยุทธ์ต่อไปนี้:
1. ใช้ SvcTraceViewer.exe
หนึ่งในเครื่องมือที่มีประสิทธิภาพที่สุดที่คุณมีคือ SvcTraceViewer.exe ซึ่งรวมอยู่ใน .NET Framework เครื่องมือนี้ช่วยให้คุณสามารถ:
- ติดตามการเรียกบริการ WCF: มันให้ข้อมูลเชิงลึกเกี่ยวกับสิ่งที่เกิดขึ้นระหว่างการเรียกบริการทำให้คุณสามารถจับข้อความแสดงข้อผิดพลาดและการตั้งค่าอย่างละเอียดได้
- แสดงผลข้อมูล Trace: คุณสามารถวิเคราะห์และแสดงผลข้อความที่บันทึกไว้ได้ง่าย ๆ เพื่อเข้าใจว่าเกิดข้อผิดพลาดที่ไหนและทำไม
สำหรับคำแนะนำในการใช้งานที่ละเอียดมากขึ้นโปรดตรวจสอบเอกสารทางการที่ MSDN’s SvcTraceViewer Overview
2. เปิดใช้งานการติดตาม WCF และการบันทึกข้อความ
เพื่อวินิจฉัยปัญหาอย่างมีประสิทธิภาพ ให้เปิดใช้งานการติดตามและการบันทึกข้อความในการตั้งค่าบริการ WCF ของคุณ:
- เพิ่มสิ่งต่อไปนี้ใน Web.config ของคุณ:
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Information, ActivityTracing">
<listeners>
<add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="WCFLog.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
- ตรวจสอบไฟล์
.svclog
ที่บันทึกไว้ เพื่อดูรายละเอียดการติดตามของคำขอและการตอบกลับระหว่างคลินต์และบริการ
3. ตรวจสอบการตั้งค่าคอนฟิกูเรชันให้ตรงกัน
ตรวจสอบให้แน่ใจว่าการตั้งค่าคอนฟิกูเรชันของคลินต์ตรงกับที่เซิร์ฟเวอร์คาดหวัง:
- การเชื่อมต่อของบริการ: ตรวจสอบให้แน่ใจว่าทั้งคลินต์และเซิร์ฟเวอร์ใช้การตั้งค่าการเชื่อมต่อเดียวกัน ตรวจสอบ
binding
ใน Web.config หรือ App.config - สัญญา: ตรวจสอบให้แน่ใจว่าทั้งคู่มีการใช้ Data Contract และ Service Contract ที่เหมือนกัน รวมถึง Actions ใดๆ ที่กำหนดไว้
4. ใช้เครื่องมือดีบัก
นอกจาก SvcTraceViewer แล้ว ให้พิจารณาใช้เทคนิคการดีบักเหล่านี้:
- การดีบักใน Visual Studio: แนบดีบักเกอร์ไปยังโปรเซสโฮสต์บริการ WCF นี้จะช่วยให้คุณดำเนินการทีละขั้นตอนเพื่อดูว่าจุดผิดพลาดเกิดขึ้นที่ไหน
- Try-Catch Blocks: ใช้บล็อก try-catch รอบส่วนรหัสที่สำคัญเพื่อจัดการข้อยกเว้นอย่างสุภาพและบันทึกรายละเอียดของข้อผิดพลาด
สรุป
การดีบักข้อผิดพลาดของ WCF Web Service อาจเป็นเรื่องที่น่ากลัว แต่การใช้เครื่องมือที่ถูกต้องและการปฏิบัติตามวิธีการแก้ไขปัญหาที่เป็นระบบสามารถทำให้การดีบักเป็นเรื่องง่ายมากขึ้น ใช้ประโยชน์จากฟีเจอร์ที่มีประสิทธิภาพของ SvcTraceViewer.exe ร่วมกับเทคนิคการดีบักอื่น ๆ เพื่อเสริมทักษะการแก้ปัญหาของคุณ
จงจำไว้ว่าความท้าทายทุกอย่างที่คุณเผชิญในโค้ดคือโอกาสที่จะเรียนรู้และปรับปรุง ขอให้การดีบักสนุก!