Servicestack - 将所有例外写入自定义记录器

Sta*_*ver 4 c# logging exception-handling exception servicestack

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

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

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

现在我被卡住了,因为这个方法不可用(有一个名为的集合ServiceExceptionHandlers,请注意最后的's').

Sco*_*ott 7

您需要使用该.Add方法,ServiceExceptionHandler因为您可以设置多个处理程序,即如果您有多个记录器.有关更多信息,请参见此处

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

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);
    };
}
Run Code Online (Sandbox Code Playgroud)

注意:

ServiceStack期望处理程序集合的原因,以及您的示例代码没有显示这一点,是因为该文档适用于v3(BSD开源版ServiceStack),相应的文档在这里,但您运行的是ServiceStack v4(商业)已经进行了改进以允许采取多种行动.

希望这可以帮助.

  • 这是一个记录(并希望在评论中允许这样做):但完全从Web Api切换到ServiceStack是我去年的最佳举措之一.与MVC/Web Api相比,路由非常简单,这总是令我头疼.由于请求/响应范例,我没有任何方法混乱. (3认同)