2010-07-14 30 views
5

Có thể nhận dịch vụ WCF trả lại lỗi '' cho khách hàng không? Tôi tin rằng điều này là có thể khi sử dụng SOAP, nhưng tôi muốn trả lại JSON.Dịch vụ WCF trả về lỗi định dạng JSON

Lý tưởng nhất, mã phản hồi HTTP sẽ được đặt thành thứ gì đó để cho biết đã xảy ra lỗi và sau đó chi tiết về sự cố sẽ có sẵn trong phản hồi JSON.

Hiện nay, tôi đang làm một cái gì đó như thế này:

[ServiceContract] 
public class MyService 
{ 
    [OperationContract] 
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] 
    [FaultContract(typeof(TestFault))] 
    public MyResult MyMethod() 
    { 
     throw new FaultException<TestFault>(new TestFault("Message..."), "Reason..."); 
    } 
} 

đâu TestFault trông như thế này:

[DataContract] 
public class TestFault 
{ 
    public TestFault(string message) 
    { 
     this.Message = message; 
    } 

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

Không có gì đặc biệt đặc biệt trong cấu hình dịch vụ tại thời điểm hiện tại là.

Điều này dẫn đến phản hồi 'Yêu cầu không hợp lệ 400', với lỗi định dạng HTML. (Khi tôi includeExceptionDetailInFaults, tôi có thể thấy 'Lý do ...' và chi tiết của FaultException, nhưng không có chi tiết về TestFault.)

dịch vụ

Web trả về JSON ok khi một Exception (hoặc FaultException) không được ném.

Mọi đề xuất ..?

+0

chưa một nỗ lực giải quyết này đây http://iainjmitchell.com/blog/?p=142 –

Trả lời

7

Chỉnh sửa: liên kết cố định + tóm tắt đã thêm.

Bạn có thể tìm thấy một lời giải thích và một giải pháp here

Để tóm tắt các giải pháp từ liên kết, mở rộng WebHttpBehavior và ghi đè AddServerErrorHandlers để thêm thực hiện của riêng bạn IErrorHandler. Việc triển khai này sẽ trích xuất lỗi từ cuộc gọi dịch vụ và tạo ra thông tin lỗi.

Bài viết được liên kết cũng cho biết cách viết Nhà máy lưu trữ dịch vụ của riêng bạn để thiết lập hành vi này.

+0

Cảm ơn Timores. Tôi đã làm việc từ điều này nhưng thiết lập một 'BehaviorExtensionElement' để hành vi có thể được chỉ định trong tệp cấu hình. –

+0

Đã bỏ phiếu xuống, vì giải pháp được liên kết không còn tồn tại nữa. – Andreas

+1

@Andreas, bạn nói đúng. Tôi đã sửa liên kết và tóm tắt nội dung của nó. – Timores

12

Tất cả những gì bạn cần đều có thể bắt đầu bằng .NET 4. xem here để biết chi tiết. Ví dụ:

throw new WebFaultException<string>(
    "My error description.", HttpStatusCode.BadRequest); 
+1

Điều này có vẻ như nó có thể đã làm việc, nhưng unfortunaetly yêu cầu. NET 4, mà tôi không thể sử dụng trong trường hợp này. –

1

Các callback lỗi của jQuery.ajax() cuộc gọi của bạn sẽ trông như thế này:

error: function (xhr, status, error) { 
    var responseObj = JSON.parse(xhr.responseText); 
    alert('Request failed with error: "' + responseObj.Message); 
} 

Trong WCF Service của bạn, vượt qua một ngoại lệ đối với các nhà xây dựng WebFaultException. thông báo tùy chỉnh của bạn sẽ có thể truy cập thông qua responseObj.Message trong javascript trên:

public class AJAXService : IAJAXService 
{ 
    public void SomeMethod() 
    { 
    throw new WebFaultException<Exception>(new Exception("some custom error message!"), HttpStatusCode.InternalServerError); 
    } 
} 
Các vấn đề liên quan