【问题标题】:Third party exception handling hooks for ServiceStack Asp.NET Core?ServiceStack Asp.NET Core 的第三方异常处理钩子?
【发布时间】:2017-04-21 01:50:32
【问题描述】:

我运行了 Exceptionless 项目,我们有一些客户在使用 ServiceStack,我有一些问题以及对您的错误处理的建议。目前你们不会将异常传递给 asp.net 核心中间件或任何diagnostics integrations,这是一个问题。有一个向这些钩子报告的包可能会很好。相反,您吃掉所有异常并调用两个处理程序之一:

ServiceExceptionHandlers.Add((httpReq, request, exception) => {
var contextData = new ContextData();
contextData.MarkAsUnhandledError();
contextData.SetSubmissionMethod("ServiceExceptionHandlers");
exception.ToExceptionless(contextData).Submit(); // TODO: figure out how to get the http context here for extra metadata.

return null; //continue with default Error Handling
});

//Handle Unhandled Exceptions occurring outside of Services
//E.g. Exceptions during Request binding or in filters:
UncaughtExceptionHandlers.Add((req, res, operationName, ex) => {
var contextData = new ContextData();
contextData.MarkAsUnhandledError();
contextData.SetSubmissionMethod("UncaughtExceptionHandlers");
ex.ToExceptionless(contextData).SetProperty("Operation", operationName).Submit(); // TODO: figure out how to get the http context here for extra metadata.

// TODO: See if we have to do this,, rather just fallback and let them handle it.
res.Write("Error: {0}: {1}".Fmt(ex.GetType().Name, ex.Message));
res.EndRequest(skipHeaders: true);
});

您可以看到我不想中断任何我只想登录并继续的工作流程...有没有什么好的方法来完成这个?

另外,我如何才能访问 http 上下文(您传递请求、响应和异常,但没有其他内容)。我知道它被抽象出来了,这里没有任何上下文,也许可能有一个属性包我可以查看以获得上下文?我想要这个,以便我可以捕获更多元数据(请求、用户等...)

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    请注意,您的问题似乎是直接向 ServiceStack 提出的,但它已发布在公共 StackOverflow 论坛上,应该向任何愿意提供帮助的人开放。

    我不想中断任何我只想登录并继续的工作流

    如果您不想中断工作流程,请在您的 ServiceExceptionHandlers 中返回 null,并且不要写信或终止您的 UncaughtExceptionHandlers 中的回复,即:

    //res.Write("Error: {0}: {1}".Fmt(ex.GetType().Name, ex.Message));
    //res.EndRequest(skipHeaders: true);
    

    如何访问 http 上下文

    您可以通过以下方式获取底层 .NET Core 请求:

    var origReq = req.OriginalRequest as HttpRequest;
    var httpCtx = origReq.HttpContext;
    

    响应也是如此:

    var origRes = res.OriginalResponse as HttpResponse;
    

    【讨论】:

    • 谢谢!您是否将请求或用户信息标准化为我可以使用的特定模型(不知道平台)
    • @BlakeNiemyjski 对于 HTTP 请求也可以转换为 IHttpReques/IHttpResponse 的 IRequest/IResponse 是涵盖所有平台的跨平台抽象。从 OriginalRequest/OriginalResponse 转换是您突破抽象并访问每个平台功能的方式。
    • 谢谢,非常感谢。我想为服务堆栈创建一个无异常的实现,因为我们的一群客户正在使用它,但现在(对我们来说)集成不是很直观。
    猜你喜欢
    • 2016-12-02
    • 2020-12-16
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 2020-12-22
    • 2017-09-14
    相关资源
    最近更新 更多