2009-07-20 31 views
6

Phương thức dịch vụ web của tôi trả về một đối tượng sưu tập, điều này sẽ tuần tự hóa một cách độc đáo, nhờ vào cách dịch vụ web C# hoạt động!Làm thế nào để trả về lỗi từ một dịch vụ Web ASMX?

Nhưng nếu mã của tôi ném một ngoại lệ vô tình, tôi muốn thay vào đó trả về một đối tượng lỗi tùy chỉnh.

Điều này có thể sử dụng C# ASP.NET v2 không?

Ví dụ,

Hoạt động bình thường nên quay lại:

<Books> 
    <book>Sample</book> 
    <book>Sample</book> 
</Books> 

Nhưng về lỗi tôi muốn

<error> 
     <errorMessage></errorMessage> 
    </error> 
+0

Lưu ý rằng dịch vụ web ASMX không hỗ trợ đúng lỗi SOAP. WSDL được tạo sẽ không xác định các lỗi, khiến một số khách hàng bỏ qua chúng hoặc trả về các lỗi nghiêm trọng khi chúng được nhận. Sử dụng WCF để tránh vấn đề này. –

Trả lời

7

Vâng, đây là có thể.

Điều bạn cần xem xét là SoapException class và cụ thể là Detail property của lớp SoapException.

Lớp SoapException sẽ hiển thị hiệu quả "Soap Fault", là cơ chế tuân thủ tiêu chuẩn để trả về thông tin lỗi cho khách hàng/người tiêu dùng từ phương thức dịch vụ web.

Thuộc tính "Chi tiết" của lớp SoapException thuộc loại XmlNode và do đó có thể chứa một nút/phần tử đơn lẻ hoặc phân cấp các nút con. Do đó, nút chi tiết có thể dễ dàng chứa và hoạt động như "cha mẹ" cho đại diện được tuần tự hóa của đối tượng lỗi tùy chỉnh của riêng bạn.

Từ MSDN:

Thuộc tính chi tiết được thiết kế để cung cấp thông tin chi tiết lỗi cụ thể ứng dụng liên quan đến các yếu tố cơ thể của các yêu cầu SOAP. Theo đặc tả SOAP, nếu một lỗi xảy ra vì yêu cầu của máy khách không thể được xử lý do phần tử Body của yêu cầu SOAP, thì thuộc tính Detail phải được thiết lập. Nếu một lỗi xảy ra trong các mục tiêu đề của yêu cầu SOAP, bạn phải ném một SoapHeaderException, để các chi tiết lỗi được trả về trong tiêu đề SOAP. Nếu lỗi không xảy ra, do việc xử lý phần tử Thân máy, thì không được đặt thuộc tính Chi tiết.

Khi xây dựng một XmlNode cho thuộc tính Detail, các thuộc tính Name và Namespace của DetailElementName có thể được sử dụng để đảm bảo tính nhất quán [sic] với đặc tả SOAP.

Tất cả các phần tử con ngay lập tức của phần tử chi tiết được gọi là các mục chi tiết và mỗi mục chi tiết được mã hóa như một phần tử độc lập trong phần tử chi tiết.

Lưu ý rằng nếu bạn muốn duy trì một cách chính xác SOAP phù hợp với phản ứng dịch vụ web của bạn, bạn sẽ cần phải trả lại một SoapHeaderException chứ không phải là một SoapException nếu lỗi xảy ra trong phần tiêu đề của khách hàng được yêu cầu XML gốc (điều này thường có thể là trường hợp khi sử dụng custom SOAP headers ví dụ như thông tin xác thực bảo mật) như được nêu chi tiết ở trên.

+0

Bạn có thể vui lòng cung cấp một ví dụ không? –

+0

@JL - Liên kết lớp SoapException trong câu trả lời của tôi (liên kết đầu tiên) chứa mã ví dụ trong cả VB và C# để gửi thông báo lỗi "tùy chỉnh". Phải thừa nhận rằng, nó tạo thuộc tính Detail bằng cách tạo thủ công và thêm đối tượng XmlNode, nhưng điều này có thể được thay thế bằng một số Xml được tạo ra từ việc tuần tự hóa đối tượng của riêng bạn, có thể sử dụng lớp System.Xml.Serialization.XmlSerializer. Xem tại đây: http://support.microsoft.com/kb/815813 – CraigTP

+0

Câu trả lời hoàn hảo hoàn hảo! Cảm ơn Craig ... Tôi rất muốn giới thiệu bất cứ ai cố gắng trả lại một đối tượng lỗi tùy chỉnh thay vì đi với ngoại lệ SOAP tiêu chuẩn. Chuẩn hóa của nó, vì vậy nó dễ dàng để biện minh cho hành động như vậy. –

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