2010-03-04 51 views
24

Chúng tôi đang phát triển một proxy trong WCF sẽ phục vụ như một phương tiện giao tiếp cho một số thiết bị cầm tay chạy ứng dụng khách hàng tùy chỉnh của chúng tôi. Tôi tò mò những gì chiến lược xử lý lỗi người sử dụng như tôi không muốn bọc EVERY proxy gọi trong try/catch.Chiến lược xử lý ngoại lệ WCF

Khi tôi phát triển ASP .NET Tôi không nắm bắt phần lớn ngoại lệ, tôi tận dụng Application_Error trong Global asax, sau đó có thể đăng nhập ngoại lệ, gửi email và chuyển hướng người dùng đến trang đích lỗi tùy chỉnh. Những gì tôi đang tìm kiếm trong WCF là tương tự như thế này, ngoại trừ việc nó sẽ cho phép tôi vượt qua một faultreason chung cho khách hàng từ một vị trí trung tâm.

Về cơ bản, tôi tò mò về cách mọi người tập trung xử lý ngoại lệ của họ trong các ứng dụng WCF.

Cảm ơn

+0

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

Trả lời

22

Bạn có thể thấy giao diện IErrorHandler hữu ích tại đây. Chúng tôi đã sử dụng điều này để làm khá nhiều những gì bạn đề cập - đăng nhập ngoại lệ tập trung và cung cấp lý do lỗi tổng quát mà không cần phải xả mã với nhiều thử/bắt để thử và giải quyết vấn đề cục bộ.

+1

Có điều này thực tế chính xác những gì tôi đang tìm kiếm, đã thực hiện một số công việc để có được nó (xem bên dưới) nhưng 100% những gì tôi cần – xximjasonxx

+0

bất kỳ ví dụ đơn giản nào được đánh giá cao – sll

+1

Bạn có thể tìm thấy một ví dụ thực hiện IErrorHandler tại đây - http: //www.neovolve.com/post/2008/04/07/implementing-ierrorhandler.aspx –

2

Chúng tôi sử dụng các ngoại lệ xử lý khối Ứng dụng và bảo vệ hầu hết các lỗi từ khách hàng để tránh tiết lộ thông tin nhạy cảm, article này có thể là một điểm khởi đầu tốt cho bạn, như với "thực hành tốt nhất" - bạn nên sử dụng những gì phù hợp với miền của bạn.

15

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.

+0

Nếu tôi đã hiểu chính xác thì cả hai đều có cùng mục tiêu. Đây là cách tôi giải quyết nó. http://stackoverflow.com/questions/6356669/wcf-exception-throwing-and-handling-the-oop-way Bạn nghĩ gì theo cách đó? – user20358