2010-07-14 90 views
5

是否有可能获得WCF服务来向客户端返回'错误'?我被认为使用SOAP时这是可能的,但我想返回JSON。WCF服务返回JSON格式的错误

理想情况下,HTTP响应代码将被设置为指示发生错误的内容,然后在JSON响应中提供该问题的详细信息。

目前,我正在做这样的事情:

[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..."); 
    } 
} 

TestFault看起来是这样的:

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

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

有没有在服务配置尤为特别的时刻。

这会导致'400错误请求'响应,并显示HTML格式的错误。 (当我includeExceptionDetailInFaults,我可以看到“理性......”和FaultException的细节,但对TestFault没有详细说明。)

的web服务,返回JSON OK了Exception(或FaultException)是不是被当抛出。

任何建议..?

+0

又一次尝试在解决这一这里http://iainjmitchell.com/blog/?p=142 – 2011-06-20 14:33:23

回答

7

编辑:固定链接+添加摘要。

你可以找到的解释和解决方案here

总结从链路解决方案,延长WebHttpBehavior,为了增加自己的实现IErrorHandler的覆盖AddServerErrorHandlers。此实现将从服务调用中提取错误并生成错误信息。

链接的文章还显示了如何编写自己的Service Host Factory来设置此行为。

+0

感谢Timores。我从此工作,但设置了一个'BehaviorExtensionElement',以便可以在配置文件中指定行为。 – 2010-07-14 14:33:38

+0

只好投票了,因为链接的解决方案不再存在。 – Andreas 2016-06-24 12:35:24

+1

@Andreas,你是对的。我修复了链接并总结了其内容。 – Timores 2016-06-24 14:34:37

12

所有您需要的都可以从.NET 4.开始,详情请参阅here。例如:

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

这看起来可能有效,但不幸的是需要.NET 4,在这种情况下我不能使用它。 – 2010-07-14 14:32:09

1

您jQuery.ajax()调用的错误回调应该是这样的:

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

在你的WCF服务,传递一个例外WebFaultException构造。您的自定义消息将通过responseObj.Message可以访问上面的javascript:

public class AJAXService : IAJAXService 
{ 
    public void SomeMethod() 
    { 
    throw new WebFaultException<Exception>(new Exception("some custom error message!"), HttpStatusCode.InternalServerError); 
    } 
}