在ServiceStack REST服务自定义异常处理(Custom exception handl

2019-07-23 02:53发布

我有一个ServiceStack REST服务,我需要实现自定义错误处理。 我已经能够通过AppHostBase.ServiceExceptionHandler设置自定义功能自定义服务错误。

然而,对于其他类型的错误,如验证错误,这是行不通的。 我怎么能涵盖所有情况的?

换句话说,我试图达到两个目的:

  1. 设置自己的HTTP状态代码为每一种例外的可能弹出,包括非服务错误(验证)
  2. 回到我自己的自定义错误对象(不是默认ResponseStatus)为每一个错误类型

我将如何去实现这一目标?

Answer 1:

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页面 。



Answer 2:

我做了改进@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.
    });
}


文章来源: Custom exception handling in ServiceStack REST service