【问题标题】:Servicestack - Write all exceptions to custom loggerServicestack - 将所有异常写入自定义记录器
【发布时间】:2014-01-26 14:07:32
【问题描述】:

我试图找到如何从我的 ServiceStack 服务中捕获所有异常(在服务器上而不是客户端上引发),以便将它们写入我的自定义记录器(将其写入事件日志)。现在我很困惑使用什么实现。我发现实现自定义ServiceRunner 的帖子看起来相当复杂。

我在文档中发现你可以使用类似的东西:

public override void Configure(Funq.Container container)
{
    this.ServiceExceptionHandler = (req, ex) => { WRITE EXCEPTION TO MY OWN LOGGER };
}

现在我被卡住了,因为这种方法不可用(有一个名为ServiceExceptionHandlers 的集合,请注意末尾的“s”)。

【问题讨论】:

    标签: c# exception logging exception-handling servicestack


    【解决方案1】:

    您需要在ServiceExceptionHandler 上使用.Add 方法,因为您可以设置多个处理程序,即如果您有多个记录器。 See here 了解更多信息。

    您需要两种方法来捕获所有异常。一个用于捕获服务中的异常,一个用于捕获其他异常。下面的代码展示了如何处理这两种情况。

    public override void Configure(Container container)
    {
        //Handle Exceptions occurring in Services:
        this.ServiceExceptionHandler.Add((httpReq, request, exception) => {
            // Log your exceptions here
            ...
            // Call the default exception handler or prepare your own custom response
            return DtoUtils.CreateErrorResponse(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);
        };
    }
    

    注意:

    ServiceStack 期望处理程序集合的原因,而您的示例代码没有显示这一点,是因为该文档适用于 v3(ServiceStack 的 BSD 开源版本)the corresponding documentation is here,但您正在运行 ServiceStack v4 (商业)进行了改进以允许采取多项操作。

    希望这会有所帮助。

    【讨论】:

    • 再次感谢您为我的问题 Scott 提供一些启发!你说得对,我使用的是(许可的)ServiceStack 版本。
    • 在进行快速测试时,我注意到 DtoUtils.HandleException 和 this.ExceptionHandler 都不作为方法存在。我现在做饭: this.ServiceExceptionHandlers.Add((httpReq, request, ex) => { var logger = container.Resolve(); logger.WriteException(ex); return null; });只返回 null 可以吗?
    • 好的,我正在测试返回 null 并且强制异常仍然正确显示在浏览器中。我想是因为它现在是处理程序的集合。但你是对的,最好返回一些有意义的东西,所以我补充说:return DtoUtils.CreateErrorResponse(request, ex);
    • @Stackbever 是的,即使您发送 null,它仍会返回正确的 Http 响应代码,即 400、404、500 等,但您是对的,最好返回包含有意义信息的响应正文。 :)
    • 这是记录的一点点(希望评论中允许这样做):但是从 Web Api 完全切换到 ServiceStack 是我去年最好的举措之一。与总是让我头疼的 MVC/Web Api 相比,路由是如此简单。由于请求/响应范例,我不再有任何方法混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 2019-05-17
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多