2013-03-14 37 views
1

我们目前正在使用ServiceStack作为我们的服务配置核心框架。 有谁知道是否可以将自定义例外封装到自定义ErrorResponse对象中?ServiceStack自定义ErrorResponse DTO

从SS维基:

“除了上述选项,你可以通过实现IResponseStatusConvertible.ToResponseStatus()方法来覆盖特设异常的系列化,使其返回自己的人口ResponseStatus实例代替。”

这似乎符合我的需求,但我无法弄清楚我可以重写此序列化的位置。

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

我当然错过了什么,有没有人可以指导我通过这个?

回答

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的描述,或者如果要更改返回的错误响应,请使用自定义服务运行器。

+0

嗨德米斯,我们正在使用IAppHost.ExceptionHandler而不是IAppHost.ServiceExceptionHandler这是没有触发。我们遇到的问题是我们的错误响应被附加到ServiceStack产生的缺省响应。我们也会看看Service Runner。非常感谢 – 2013-03-14 17:11:22

+0

@MarcoSerina只会为服务中的异常解雇IAppHost.ServiceExecptionHandler。对于外部发生的异常(例如过滤器,请求绑定等),您可以使用'IAppHost.ExceptionHandler'。 – mythz 2013-03-14 17:39:30

相关问题