2009-06-19 21 views
11

Tôi không chắc mình hoàn toàn hài lòng khi ném ngoại lệ trong các dịch vụ web là một ý tưởng hay. Tôi sẽ không quan tâm nhiều nếu nó không phải là dấu vết ngăn xếp. Đây không phải là điều tôi không thể.Dịch vụ web có nên ném ngoại lệ HOẶC các đối tượng kết quả

Tôi đã nghiên cứu xung quanh một số triển khai và thực sự dường như không có sự đồng thuận về điều này. CampaignMonitor chẳng hạn trả về một đối tượng Result, nhưng một số khác thì không.

Kiến trúc, tôi không chắc chắn trả về đối tượng trả về có ý nghĩa, chắc chắn ngoại lệ là ngoại lệ, nhưng những gì tôi thích về đối tượng Trả về là giải pháp duyên dáng hơn cho người dùng cuối.

Có ai có giải pháp nào tốt hơn không?

EDIT

BTW Tôi đang sử dụng dịch vụ web ASMX, trong đó việc bật CustomErrors on không phải là một tùy chọn.

+0

Thực ra, tôi tin rằng cách xóa chi tiết ngoại lệ là bằng cách chơi với thẻ customErrors trong web.config. Tin hay không. –

+0

@ John: Vâng, đó là những gì tôi đang nói ở đây. Thật không may này không phải là một lựa chọn cho tôi. Nếu không, nó sẽ là một vấn đề đơn giản hơn nhiều đối với tôi: ( –

Trả lời

6

Bạn đang nói về dấu vết ngăn xếp nào? Bạn đã thử cái này chưa?

Trong cả hai dịch vụ ASMX và WCF, ngoại lệ không được bắt buộc sẽ được dịch thành lỗi SOAP. Trong cả hai trường hợp, chúng có thể được định cấu hình để không bao gồm bất kỳ dấu vết ngăn xếp nào. Trong thực tế, đó là mặc định trong WCF.

Vì vậy, cách thích hợp để trả về lỗi như thế này là do lỗi. Một cách để tạo ra lỗi là ném và không xử lý một ngoại lệ.

+0

Về bản chất tất cả những gì tôi muốn thông báo cho người dùng là một ngoại lệ với mã lỗi và giải mã (do tôi lựa chọn) Tôi cảm thấy có sự khác biệt ngữ nghĩa giữa xử lý ngoại lệ cho các dịch vụ web và kiến ​​trúc ứng dụng nhưng tôi không chắc chắn liệu chúng có nên được xử lý khác nhau hay không, bạn sẽ không trả về một đối tượng Result trong mã khi có lỗi. Tôi cho rằng câu hỏi của tôi là làm cách nào để tóm tắt chi tiết ngoại lệ? –

+2

Đọc trên các lỗi SOAP.Đây là cách tiêu chuẩn để trả lại chi tiết tùy ý cho một khách hàng Trong các dịch vụ web ASMX, bạn phải trả lại chúng "bằng tay" trong Chi tiết thuộc tính của một cá thể SoapException, nhưng đó là cách đúng đắn nếu bạn phải ở lại với ASMX Tất nhiên, cách tốt hơn là sử dụng WCF, cũng đừng nghĩ về nó như thông báo cho người dùng về các ngoại lệ. chi tiết triển khai. Bạn đang thông báo cho họ về một lỗi. –

+0

Đây không phải là những gì tôi quan sát. Các dịch vụ web ASMX của tôi đều trả về các dấu vết ngăn xếp trong các thiết lập mặc định, và nó làm tôi phát điên. Và khi có một chuỗi các dịch vụ gọi nhau, và chuỗi cuối cùng trong chuỗi ném, khách hàng sẽ nhận được một dấu vết ngăn xếp dữ dội từ tất cả các dịch vụ tham gia (dưới dạng một 'SoapException' thuộc tính' Message' trong đó chứa ngăn xếp theo dõi dưới dạng văn bản nối). Điều này thật khủng khiếp và tôi không biết cách tắt nó đi. – GSerg

0

Bạn có thể làm rõ một chút không? Phía máy chủ của một dịch vụ web có thể ném một ngoại lệ. Phía máy chủ của một dịch vụ web có thể trả về một thông báo cho phía máy khách. Thông báo đó có thể chứa thông tin lỗi và thông tin lỗi đó có thể bao gồm chi tiết ngoại lệ cụ thể. Hoặc nó có thể không. Ở phía máy khách, bạn thường có một proxy được tạo để xử lý thư từ máy chủ. Proxy này có thể tạo ra một ngoại lệ nếu đáp ứng đó chứa thông tin lỗi.

Bạn đang phân vân về phần nào của tình huống này?

+0

@Bruce: các trường hợp ngoại lệ chưa được thực hiện sẽ được chuyển thành lỗi.Trong một số trường hợp, những trường hợp đó sẽ bao gồm các chi tiết excepton. –

+0

@Bruce: Tôi hiểu cách dịch vụ web hoạt động, ý tôi là thiết kế kiến ​​trúc nhiều hơn. Có những trường hợp tôi yêu cầu ném ngoại lệ. Trong những trường hợp này, thông tin theo dõi stack được tuần tự hóa cho máy khách. Tôi không nghĩ đây là một ý hay. Cách tốt nhất để ẩn chi tiết là gì? Hoặc là câu trả lời để trả về một đối tượng "Return" (ví dụ mà tôi đưa ra là ví dụ api CampaignMonitors). –

+0

@Ryan: làm việc thông qua tất cả các kết hợp của thẻ customeError trong web.config. Tôi tin rằng một trong số họ sẽ tắt dấu vết ngăn xếp. –

0

Tôi cho rằng ném ngoại lệ nói chung là mẫu thiết kế tốt hơn, sau đó trả lại kết quả. Tôi giả sử rằng bạn phải làm là bên trong các dịch vụ web của bạn để ẩn dấu vết ngăn xếp bằng cách áp dụng các mô hình sau đây để mỗi phương pháp tiếp xúc như dịch vụ web:

public void MyWebServiceMethod() {
try
{

///Do something that may cause an error 

} catch(Exception ex)
{ throw new ApplicationException("User friendly descritption of exception");

}

}

hoặc bạn cũng có thể

catch(Exception ex) { throw ex; }

Nếu bạn ném lại một ngoại lệ, bạn sẽ ẩn dấu vết ngăn xếp ban đầu từ các máy khách của các dịch vụ web của bạn.

+0

@Bogdan: Đầu tiên, MS đã không dùng lại cách sử dụngExceptionException trong .NET 1.1. Thay vào đó hãy sử dụng "Ngoại lệ". Thứ hai, tôi có ấn tượng rằng OP không muốn có dấu vết ngăn xếp nào cả. –

+1

@John, bởi ApplicationException Tôi có nghĩa là bất kỳ ngoại lệ tùy chỉnh nào. Ok, cho phép nói nó phải là MyWebServiceException hoặc một cái gì đó như thế này. Ngoài ra, trên thực tế, nó không bị phản đối và các ngoại lệ như System.Threading.WaitHandleCannotBeOpenedException vẫn được kế thừa từ điều này. MS chỉ nói rằng họ không nghĩ rằng nó rất có giá trị, nhưng vẫn còn những gì bạn sử dụng làm lớp cơ sở cho ngoại lệ của bạn tự nhiên là lựa chọn của riêng bạn, điều đó đôi khi được quyết định bởi các quy ước mã hóa bạn nên tuân thủ trong dự án hiện tại. –

8

Đừng để thực tế rằng bạn đang sử dụng dịch vụ web gây nhầm lẫn vấn đề. Đó chỉ là một chi tiết thực hiện.

Sử dụng chiến lược xử lý ngoại lệ thông thường của bạn. Thực hành tốt nhất nói đừng bẫy ngoại lệ trong mã cấp thấp - trừ khi bạn có thể giải quyết ngoại lệ đó và tiếp tục bình thường. Các ngoại lệ nên được nâng lên lớp trình bày để người dùng có thể được thông báo về lỗi.

Vì vậy, như được áp dụng cho dịch vụ web - nói chung ném ngoại lệ (dẫn đến SoapFault). Điều này cho phép mã máy khách gọi để sử dụng nó được xây dựng trong tiêu chuẩn xử lý ngoại lệ để xử lý nó.

+0

@Maladon: đây là câu trả lời hay, ngoại trừ ranh giới lớp. Nói chung, chiến lược thay đổi trên ranh giới lớp, đặc biệt là ở lớp dịch vụ. Đặc biệt, đối với WCF, một ranh giới lớp sẽ là một nơi tốt để bắt ngoại lệ "A" và reaplace nó với FaultException , mà sẽ gửi lỗi SOAP AFault. Không có dấu vết ngăn xếp, BTW. ASMX không hỗ trợ lỗi đúng cách; một lý do khác để ngừng sử dụng nó. –

2

một cách tiếp cận là tách các lỗi hệ thống và doanh nghiệp. (Lỗi hệ thống: ví dụ: yêu cầu không đúng định dạng, lỗi kinh doanh do người dùng không được ủy quyền, v.v.; ví dụ: phương pháp UpdateCars dẫn đến lỗi, người dùng không sở hữu bất kỳ ô tô nào).

Trong trường hợp có lỗi kinh doanh, trả về đối tượng phản hồi có chứa mô tả lỗi; trong trường hợp có lỗi hệ thống, hãy ném một ngoại lệ.

+1

Thông số SOAP cung cấp các lỗi để trả về các điều kiện lỗi và chúng nên được sử dụng. Nếu không, khách hàng của bạn sẽ quay trở lại với việc phải nhớ kiểm tra các giá trị trả về lỗi và sẽ không thể sử dụng bản dịch cụ thể cho các lỗi của nền tảng của họ. –

0

Tôi không hiểu tại sao bạn không thể làm cả hai? Nắm bắt ngoại lệ, đăng nhập nó (hoặc là một DB hoặc một tập tin), sau đó trả về một mã lỗi. Bằng cách đó bạn có một thực hiện duyên dáng của các cuộc gọi webservice, và cũng thông báo lỗi, và bạn có một chỗ ở nơi khác, bạn có thể tiếp tục gỡ lỗi.

+0

@James: gắn bó với tiêu chuẩn có thể tốt hơn. Nó cung cấp cho lỗi, vậy tại sao không sử dụng chúng? Ngoài ra, các nhà phát triển quên kiểm tra mã lỗi. Đó là lý do tại sao ngoại lệ được phát minh và lỗi SOAP là phiên bản dịch vụ web của ngoại lệ. –

+0

Như @ John nói, và tôi đồng ý, có những ngoại lệ để thông báo lỗi. Các ngoại lệ sẽ được sắp xếp thành một lỗi SOAP. Kết quả là trả về một mã lỗi không phù hợp với giao thức rất tốt. Xem bên dưới: http://msdn.microsoft.com/en-us/library/ds492xtk(VS.85).aspx –

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