我试图找到如何从我的ServiceStack服务捕获所有异常(在服务器而不是客户端引发),以便将它们写入我的自定义记录器(将其写入事件日志)。现在我很困惑使用什么实现。我发现实现自定义ServiceRunner
的帖子看起来相当复杂。
我在文档中发现你可以使用类似的东西:
public override void Configure(Funq.Container container)
{
this.ServiceExceptionHandler = (req, ex) => { WRITE EXCEPTION TO MY OWN LOGGER };
}
现在我被卡住了,因为这个方法不可用(有一个名为ServiceExceptionHandlers
的集合,请注意最后的's'。
答案 0 :(得分:7)
您需要在.Add
上使用ServiceExceptionHandler
方法,因为您可以设置多个处理程序,即如果您有多个记录器。 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(商业)已经进行了改进,允许采取多种行动。
希望这有帮助。