我有一个ServiceStack REST服务,我需要实现自定义错误处理。 我已经能够通过AppHostBase.ServiceExceptionHandler设置自定义功能自定义服务错误。
然而,对于其他类型的错误,如验证错误,这是行不通的。 我怎么能涵盖所有情况的?
换句话说,我试图达到两个目的:
- 设置自己的HTTP状态代码为每一种例外的可能弹出,包括非服务错误(验证)
- 回到我自己的自定义错误对象(不是默认ResponseStatus)为每一个错误类型
我将如何去实现这一目标?
我有一个ServiceStack REST服务,我需要实现自定义错误处理。 我已经能够通过AppHostBase.ServiceExceptionHandler设置自定义功能自定义服务错误。
然而,对于其他类型的错误,如验证错误,这是行不通的。 我怎么能涵盖所有情况的?
换句话说,我试图达到两个目的:
我将如何去实现这一目标?
该AppHostBase.ServiceExceptionHandler
全球处理器只能处理服务异常 。 为了处理发生的服务,您可以设置全局的例外情况外AppHostBase.ExceptionHandler
处理程序,如:
public override void Configure(Container container)
{
//Handle Exceptions occurring in Services:
this.ServiceExceptionHandler = (request, exception) => {
//log your exceptions here
...
//call default exception handler or prepare your own custom response
return DtoUtils.HandleException(this, request, exception);
};
//Handle Unhandled Exceptions occurring outside of Services,
//E.g. in Request binding or filters:
this.ExceptionHandler = (req, res, operationName, ex) => {
res.Write("Error: {0}: {1}".Fmt(ex.GetType().Name, ex.Message));
res.EndServiceStackRequest(skipHeaders: true);
};
}
要创建和序列化DTO在非服务的响应流ExceptionHandler
你需要访问并使用正确的串行从IAppHost.ContentTypeFilters请求 。
有关详细信息是在错误处理wiki页面 。
我做了改进@mythz的回答 。
public override void Configure(Container container) {
//Handle Exceptions occurring in Services:
this.ServiceExceptionHandlers.Add((httpReq, request, exception) = > {
//log your exceptions here
...
//call default exception handler or prepare your own custom response
return DtoUtils.CreateErrorResponse(request, exception);
});
//Handle Unhandled Exceptions occurring outside of Services
//E.g. Exceptions during Request binding or in filters:
this.UncaughtExceptionHandlers.Add((req, res, operationName, ex) = > {
res.Write("Error: {0}: {1}".Fmt(ex.GetType().Name, ex.Message));
#if !DEBUG
var message = "An unexpected error occurred."; // Because we don't want to expose our internal information to the outside world.
#else
var message = ex.Message;
#endif
res.WriteErrorToResponse(req, req.ContentType, operationName, message, ex, ex.ToStatusCode()); // Because we don't want to return a 200 status code on an unhandled exception.
});
}