我们目前正在使用ServiceStack作为服务供应的核心框架。
有谁知道是否可以将自定义异常包装到自定义ErrorResponse
对象中?
来自SS wiki:
“除了上述选项之外,您还可以通过实现IResponseStatusConvertible.ToResponseStatus()方法来覆盖特殊异常的序列化,并让它返回您自己填充的ResponseStatus实例。”
这似乎符合我的需要,但我无法弄清楚我可以覆盖这个序列化的位置。
同样,我尝试通过在AppHost中注册它们来使用自定义httphandler
,但是在发生异常时不会调用它们。
我当然错过了什么,是否有人可以指导我完成这项工作?
答案 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
的说明或使用自定义服务运行器。