Vì vậy, đây là những gì tôi đã làm. Chúng tôi có một vài ngoại lệ tùy chỉnh trong ứng dụng của chúng tôi như BusinessRuleException và ProcessException, WCF hỗ trợ cả FaultException và FaultException<T>
.
Thực hành chung có vẻ là bạn luôn ném FaultException cho ứng dụng khách trong trường hợp xảy ra lỗi chung hoặc lỗi mà bạn không muốn hiển thị chính xác những gì đã xảy ra. Trong các trường hợp khác, bạn có thể vượt qua FaultException<T>
trong đó T là một lớp có thông tin về ngoại lệ cụ thể.
Tôi đã tạo khái niệm này về Vi phạm trong ứng dụng, về cơ bản có nghĩa là bất kỳ ngoại lệ tùy chỉnh nào có thuộc tính chứa phiên bản Vi phạm tương ứng. Ví dụ này sau đó được truyền xuống cho máy khách cho phép máy khách nhận ra khi một lỗi có thể phục hồi đã xảy ra.
Điều này giải quyết một phần của vấn đề, nhưng tôi vẫn muốn nắm bắt tất cả những gì sẽ cho phép tôi tập trung vào việc ghi nhật ký. Tôi tìm thấy điều này bằng cách sử dụng giao diện IErrorHandle và thêm trình xử lý lỗi tùy chỉnh của riêng tôi vào WCF. Đây là mã:
public class ServiceHostGeneralErrorHandler : IErrorHandler
{
public void ProvideFault(Exception ex, MessageVersion version, ref Message fault)
{
if (ex is FaultException)
return;
// a general message to the client
var faultException = new FaultException("A General Error Occured");
MessageFault messageFault = faultException.CreateMessageFault();
fault = Message.CreateMessage(version, messageFault, null);
}
public bool HandleError(Exception ex)
{
// log the exception
// mark as handled
return true;
}
}
Sử dụng phương pháp này, tôi có thể chuyển đổi các ngoại lệ từ bất cứ điều gì nó là cái gì mà có thể dễ dàng hiển thị trên máy khách trong khi cùng một lúc đăng nhập, ngoại trừ thực sự cho các nhân viên IT để xem . Cho đến nay phương pháp này hoạt động khá tốt và theo cùng cấu trúc với các mô-đun khác trong ứng dụng.
Câu hỏi quan trọng: Bạn có đang sử dụng lỗi tùy chỉnh/hợp đồng lỗi không? – Aaronaught