2008-09-17 49 views
37

Hiện tại chúng tôi đang tranh luận xem có nên ném lỗi qua kênh WCF hay không, so với thông báo cho biết trạng thái hoặc phản hồi từ dịch vụ.WCF - Lỗi/Ngoại lệ so với Thông báo

Lỗi đi kèm với sự hỗ trợ tích hợp từ WCF nơi bạn có thể sử dụng trình xử lý lỗi tích hợp và phản ứng tương ứng. Điều này, tuy nhiên, mang trên không như ném ngoại lệ trong. NET có thể khá tốn kém.

Tin nhắn có thể chứa thông tin cần thiết để xác định những gì đã xảy ra với cuộc gọi dịch vụ của bạn mà không phải trả phí ngoại lệ. Tuy nhiên nó cần một số dòng mã lặp lại để phân tích thông điệp và xác định các hành động theo nội dung của nó.

Chúng tôi mất một đâm vào việc tạo ra một đối tượng thông điệp chung chung chúng ta có thể sử dụng trong các dịch vụ của chúng tôi, và đây là những gì chúng tôi đã đưa ra:

public class ReturnItemDTO<T> 
{ 
    [DataMember] 
    public bool Success { get; set; } 

    [DataMember] 
    public string ErrorMessage { get; set; } 

    [DataMember] 
    public T Item { get; set; } 
} 

Nếu tất cả các cuộc gọi dịch vụ của tôi trở lại mặt hàng này, tôi luôn có thể kiểm tra thuộc tính "Thành công" để xác định xem mọi thứ có ổn không. Sau đó, tôi có một chuỗi thông báo lỗi trong sự kiện cho biết đã xảy ra sự cố và một mục chung chứa Dto nếu cần.

Thông tin ngoại lệ sẽ phải được đăng xuất khỏi dịch vụ ghi nhật ký trung tâm và không được chuyển trả lại từ dịch vụ.

Suy nghĩ? Bình luận? Ý tưởng? Gợi ý?

Một số rõ hơn về câu hỏi của tôi

Một vấn đề tôi đang gặp với hợp đồng lỗi được trao đổi quy tắc kinh doanh.

Giống như, nếu ai đó đăng nhập và tài khoản của họ bị khóa, tôi làm cách nào để liên lạc? Đăng nhập của họ rõ ràng là không thành công, nhưng nó không thành công vì lý do "tài khoản bị khóa".

Vì vậy, làm tôi:

A) sử dụng một boolean, ném lỗi với tài khoản nhắn tin bị khóa

B) trở AuthenticatedDTO với thông tin liên quan

Trả lời

31

Tuy nhiên điều này mang overhead như ném ngoại lệ trong. NET có thể khá tốn kém.

Bạn đang sắp xếp và loại bỏ các đối tượng thành XML và gửi chúng qua mạng chậm .. chi phí từ việc ném ngoại lệ là không thể so sánh được.

Tôi thường dính vào ném ngoại lệ, vì họ truyền đạt rõ ràng đã xảy ra sự cố và tất cả bộ công cụ webservice có cách xử lý tốt.

Trong mẫu của bạn, tôi sẽ ném một UnauthorizedAccessException với thông báo "Tài khoản đã khóa".

Làm rõ: Dịch vụ .NET wcf dịch ngoại lệ thành FaultContracts theo mặc định, nhưng bạn có thể thay đổi hành vi này.MSDN:Specifying and Handling Faults in Contracts and Services

+0

Tôi không đồng ý. Vì WCF được coi là không thuyết phục về ngôn ngữ (ít nhất là ở một dạng nào đó), bạn không thể đảm bảo rằng việc truyền một đối tượng ngoại lệ xuống dây sẽ không gây ra vấn đề về buig ví dụ. Khách hàng Java. Loại đối tượng FaultContract có thể đảm bảo khả năng tương tác vì nó là một phần của thông số kỹ thuật OASIS. – ZombieSheep

+4

.NET dịch ngoại lệ sang các hợp đồng Lỗi. Xem liên kết tôi đã thêm vào câu trả lời của mình. –

+0

Tôi đã luôn luôn ấn tượng rằng ném một ngoại lệ mang chi phí không cần thiết. Từ bài viết của bạn, tôi dường như đã được sai lầm sai lầm. Trước khi tôi đánh dấu bài đăng này là asnwer, tôi muốn nhận thêm một số ý kiến. Nhưng xem xét đầu vào của bạn, có vẻ như hợp đồng lỗi là lựa chọn tốt hơn – WebDude

0

Tôi sẽ xem xét nghiêm túc việc sử dụng các đối tượng FaultContract và FaultException để giải quyết vấn đề này. Điều này sẽ cho phép bạn truyền các thông báo lỗi có ý nghĩa trở lại máy khách, nhưng chỉ khi xảy ra tình trạng lỗi.

Thật không may, tôi đang tham gia khóa đào tạo tại thời điểm này, vì vậy không thể viết câu trả lời đầy đủ, nhưng may mắn là tôi đang học về quản lý ngoại lệ trong các ứng dụng WCF. Tôi sẽ đăng lại tối nay với nhiều thông tin hơn. (Xin lỗi, đó là câu trả lời yếu)

6

Nếu bạn nghĩ đến việc gọi dịch vụ như gọi bất kỳ phương pháp nào khác, nó có thể giúp đưa mọi thứ vào quan điểm. Hãy tưởng tượng nếu mọi phương thức bạn gọi lại đều trả về trạng thái và bạn có thể kiểm tra xem nó có đúng hay sai. Nó sẽ nhận được khá tẻ nhạt.

result = CallMethod(); 
if (!result.Success) handleError(); 

result = CallAnotherMethod(); 
if (!result.Success) handleError(); 

result = NotAgain(); 
if (!result.Success) handleError(); 

Đây là một trong những điểm mạnh của hệ thống xử lý lỗi có cấu trúc, là bạn có thể tách logic thực tế khỏi xử lý lỗi. Bạn không cần phải tiếp tục kiểm tra, bạn biết đó là một thành công nếu không có ngoại lệ nào được ném ra.

try 
{ 
    CallMethod(); 
    CallAnotherMethod(); 
    NotAgain(); 
} 
catch (Exception e) 
{ 
    handleError(); 
} 

Đồng thời, bằng cách trả lại kết quả, bạn đang đặt nhiều trách nhiệm hơn cho khách hàng. Bạn cũng có thể biết để kiểm tra lỗi trong đối tượng kết quả, nhưng John Doe đi vào và chỉ bắt đầu gọi đi đến dịch vụ của bạn, quên rằng bất cứ điều gì là sai vì một ngoại lệ không được ném. Đây là một điểm mạnh khác của ngoại lệ là chúng cho chúng ta một cái tát tốt vào mặt khi có điều gì đó sai và cần được chăm sóc.

Các vấn đề liên quan