ServiceStack自定义ErrorResponse DTO

时间:2013-03-14 16:36:24

标签: servicestack

我们目前正在使用ServiceStack作为服务供应的核心框架。 有谁知道是否可以将自定义异常包装到自定义ErrorResponse对象中?

来自SS wiki:

  

“除了上述选项之外,您还可以通过实现IResponseStatusConvertible.ToResponseStatus()方法来覆盖特殊异常的序列化,并让它返回您自己填充的ResponseStatus实例。”

这似乎符合我的需要,但我无法弄清楚我可以覆盖这个序列化的位置。

同样,我尝试通过在AppHost中注册它们来使用自定义httphandler,但是在发生异常时不会调用它们。

我当然错过了什么,是否有人可以指导我完成这项工作?

1 个答案:

答案 0 :(得分:1)

这是ServiceStack的Error Handling wiki page

它的含义是,如果自定义异常实现IResponseStatusConvertible,您可以控制 ResponseStatus 的序列化方式。以下是ValidationException实现它的源代码示例:

public class ValidationException : ArgumentException, IResponseStatusConvertible 
{
    public IEnumerable<ValidationFailure> Errors { get; private set; }

    public ValidationException(IEnumerable<ValidationFailure> errors) : base(BuildErrorMesage(errors)) {
        Errors = errors;
    }

    private static string BuildErrorMesage(IEnumerable<ValidationFailure> errors) {
        var arr = errors.Select(x => "\r\n -- " + x.ErrorMessage).ToArray();
        return "Validation failed: " + string.Join("", arr);
    }

    public ResponseStatus ToResponseStatus()
    {
        var errors = Errors.ConvertAll(x =>
            new ValidationErrorField(x.ErrorCode, x.PropertyName, x.ErrorMessage));

        var responseStatus = ResponseStatusUtils.CreateResponseStatus(typeof(ValidationException).Name, Message, errors);
        return responseStatus;
    }
}

但这仅控制ResponseStatus的序列化方式,而不是如何创建泛型响应。如果要更改返回的错误响应,请查看IAppHost.ServiceExceptionHandler的说明或使用自定义服务运行器。