ฉันกำลังทำงานในโปรเจ็กต์ที่ใช้การเรียก WCF หลายครั้งเพื่อดำเนินการตามขั้นตอน การโทรครั้งแรกจะส่งกลับ ID เฉพาะ (Guid) ซึ่งต้องระบุการโทรต่อไปนี้ทั้งหมด ฝั่งเซิร์ฟเวอร์ การโทรแต่ละครั้งจะถูกบันทึกพร้อมกับ ID เฉพาะนั้นเพื่อให้สามารถดูหลักสูตรของขั้นตอนเดียวได้ (สมมติว่าไคลเอ็นต์สามารถเริ่มขั้นตอนเหล่านั้นหลายขั้นตอนพร้อมกันได้ และปลอดภัยสำหรับเธรด)< /em>.
ตัวอย่างฝั่งไคลเอ็นต์จะมีลักษณะดังนี้:
string clientName = GetClientName();
Guid uniqueId = wcfClient.Begin(clientName);
object data = wcfClient.GetData(clientName, uniqueId);
object processedData = ProcessDataLocally(data);
bool success = wcfClient.confirmDataValidity(clientName, uniqueId, processedData);
// ...
wcfClient.End(clientName, uniqueId);
หากมีสิ่งผิดปกติเกิดขึ้นบนฝั่งเซิร์ฟเวอร์ ฉันต้องการให้ระบบบันทึกข้อมูลนั้นด้วย โดยใช้รหัสเฉพาะที่มอบให้กับการโทรที่ผิดพลาด เพื่อจุดประสงค์นั้น ฉันทำให้วิธีการบริการทั้งหมดมีฟังก์ชันดังต่อไปนี้:
private T DoProcess<T>(Guid uniqueId, Func<T> process)
{
try
{
return process();
}
catch(Exception ex)
{
Log(ex, uniqueId);
throw; // or throw the same thing every time, if the client
// shouldn't know the details
}
}
public object GetData(string clientName, Guid uniqueId)
{
return DoProcess(uniqueId, () =>
{
object data;
// Generate data
return data;
});
}
อย่างไรก็ตาม ดูเหมือนว่าการทำเช่นนี้ไม่ได้ตรวจพบข้อผิดพลาดที่อาจเกิดขึ้นทั้งหมด (เช่น หากการเชื่อมต่อหมดเวลา)
ฉันอ่านเกี่ยวกับการใช้อินเทอร์เฟซ IErrorHandler
และการแนบไปกับบริการ แม้ว่าสิ่งนี้ดูเหมือนจะตรวจจับข้อผิดพลาดทั้งหมดได้ แต่ดูเหมือนว่าจะไม่มีทางส่งข้อมูลไปให้ข้อผิดพลาดอื่นใดได้นอกจากข้อยกเว้น เช่น รหัสเฉพาะ ดังนั้นจึงไม่มีวิธีบันทึก ID
เป็นไปได้หรือไม่ที่จะตรวจจับข้อยกเว้นทั้งหมดและรวมข้อมูลที่ถูกส่งผ่านไปยังวิธีการที่ข้อยกเว้นถูกส่งออกไป?