这是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
的描述,或者如果要更改返回的错误响应,请使用自定义服务运行器。
嗨德米斯,我们正在使用IAppHost.ExceptionHandler而不是IAppHost.ServiceExceptionHandler这是没有触发。我们遇到的问题是我们的错误响应被附加到ServiceStack产生的缺省响应。我们也会看看Service Runner。非常感谢 – 2013-03-14 17:11:22
@MarcoSerina只会为服务中的异常解雇IAppHost.ServiceExecptionHandler。对于外部发生的异常(例如过滤器,请求绑定等),您可以使用'IAppHost.ExceptionHandler'。 – mythz 2013-03-14 17:39:30