如何从AJAX启用的WCF服务返回JSON中的错误?

时间:2011-07-24 13:59:33

标签: ajax wcf json exception-handling

我有一个支持AJAX的WCF服务(行为中包含enableWebScript),它有一个我创建的ValidationFault。

这是服务:

[ServiceContract]
public interface ICoreWCF
{
    /// <summary>
    /// Saves the Customer.
    /// </summary>
    [OperationContract]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    [FaultContract(typeof(ValidationFault))]
    void Customer_Save(Customer customer);
}

这是错误:

[DataContract]
public class ValidationFault
{
    [DataMember(Name = "success")]
    public bool Success { get; set; }

    [DataMember(Name = "msg")]
    public string ValidationMessage { get; set; }

    [DataMember(Name = "errors")]
    public Dictionary<string, string> Errors { get; set; }
}

我想将此错误发送回客户端javascript。 问题是我的自定义错误的DataMembers被忽略,并返回一般异常。

如何将错误集合发送给客户?

我已经尝试编写自己的IErrorHandler,类似于this,因此它使用异常处理应用程序块将异常转换为错误,然后IErrorHandler序列化生成的错误。但似乎WebScriptingEnablingBehavior的JsonErrorHandler与生成的Message对象的处理效果不佳。

感谢。

2 个答案:

答案 0 :(得分:0)

在webinvoke中

您可以添加RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json 试试吧

答案 1 :(得分:0)

如果您已实现IErrorHandler并使用从WebHttpBehavior继承的自定义行为将其与服务相关联,那么您可能应该尝试添加默认请求/响应格式等。例如,

private class CustomWebScriptBehavior : WebHttpBehavior
{
    protected override void AddServerErrorHandlers(ServiceEndpoint endpoint,
        System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
    {
        // clear current error handlers
        endpointDispatcher.ChannelDispatcher.ErrorHandlers.Clear();
        // add our error handler
        endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(
                new ErrorHandler(true));
    }

    private WebMessageFormat _requestFormat;
    private WebMessageFormat _responseFormat;

    public CustomWebScriptBehavior()
    {
        _requestFormat = _responseFormat = WebMessageFormat.Json;
    }

    public override bool AutomaticFormatSelectionEnabled
    {
        get { return false; }
        set { throw new NotSupportedException(); }
    }

    public override WebMessageBodyStyle DefaultBodyStyle
    {
        get { return WebMessageBodyStyle.WrappedRequest; }
        set { throw new NotSupportedException(); }
    }

    public override WebMessageFormat DefaultOutgoingRequestFormat
    {
        get { return _requestFormat; } 
        set { _requestFormat = value; }
    }

    public override WebMessageFormat DefaultOutgoingResponseFormat
    {
        get { return _responseFormat; }
        set { _responseFormat = value; }
    }
}

这将消除为每个方法指定WebInvoke属性的需要。