首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在.Net Core MVC中使用Hellang中间件进行异常处理

在.Net Core MVC中使用Hellang中间件进行异常处理
EN

Stack Overflow用户
提问于 2021-05-25 22:07:56
回答 3查看 513关注 0票数 1

在我的Hellang应用程序中,我使用Middleware进行异常处理作为全局异常处理机制。我在Startup.cs的ConfigureServices方法中添加了以下代码:

代码语言:javascript
运行
复制
services.AddProblemDetails(opts =>
            {
                // Control when an exception is included
                opts.IncludeExceptionDetails = (ctx, ex) =>
                {
                    // Fetch services from HttpContext.RequestServices
                    var env = ctx.RequestServices.GetRequiredService<IHostEnvironment>();
                    return env.IsDevelopment() || env.IsStaging();
                };
                opts.ShouldLogUnhandledException = (ctx, e, d) =>
                {
                    return (d.Status.HasValue && d.Status.Value >= 500);
                };
            });

我还在Configure方法中添加了UseProblemDetails()

然而,我开始意识到,如果我使用UseProblemDetails(),那么UseExceptionHandler()将无法工作!因此,我不能想出一个方法来导航用户到一个常见的错误视图页面。

有没有办法将用户重定向到错误页面,同时坚持使用Hellang中间件进行异常处理和日志记录?

EN

回答 3

Stack Overflow用户

发布于 2021-11-16 14:50:35

我也遇到过类似的问题。我像下面这样解决了这个问题。在此示例中,记录自定义业务故障异常:

代码语言:javascript
运行
复制
services.AddProblemDetails(setup =>
{
    setup.Map<FaultException<BusinessFault>>((context, exception) =>
    {
        // resolve logger
        var logger = context.RequestServices.GetRequiredService<ILogger<ProblemDetails>>();

        // log exception to Seq
        logger.LogError(exception, "{@Exception} occurred.", exception);

        // return the problem details map   
        return new ProblemDetails
        {
            Title = exception.Message,
            Detail = exception.Detail.FaultMessage,
            Status = exception.Detail.FaultType.ToHttpStatus(),
            Type = exception.Detail.FaultType.ToString(),
            Instance = exception.Detail.FaultReference
        };
    });
});
票数 2
EN

Stack Overflow用户

发布于 2021-06-02 15:59:13

答案在这里:https://stackoverflow.com/a/40153711/90287

您必须区分请求的类型,是应用程序接口请求还是用户界面请求,以分别确定是否应返回problem+details JSON或是否应返回网页。

这就是我在Startup.csConfigure方法的顶部附近所做的事情

代码语言:javascript
运行
复制
app.UseWhen(context => context.IsApiRequest(), branch =>
{
    branch.UseProblemDetails();
});

app.UseWhen(context => !context.IsApiRequest(), branch =>
{
    branch.UseExceptionHandler("/Home/Error");
});

您可以定义自己的自定义HttpContext扩展方法:

代码语言:javascript
运行
复制
public static class HttpContextExtensions
{
    public static bool IsApiRequest(this HttpContext context)
    {
        return context.Request.Path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase)
            || (context.Request.Headers["X-Requested-With"] == "XMLHttpRequest"); // AJAX request
    }
}
票数 1
EN

Stack Overflow用户

发布于 2021-06-09 13:48:18

这不完全是您问题的答案,但我在Web API应用程序中遇到了类似的问题,涉及到使用ExceptionHandler中间件和Hellang ProblemDetails中间件,我也意识到我不能同时使用它们,因为它们以各自的方式更改响应,并相互影响。

根据文档here,您可以在更改响应之前使用ProblemDetails包的一个配置选项来执行代码,并且可以在那里记录所需的所有信息。

代码语言:javascript
运行
复制
services.AddProblemDetails(options =>
        {
            options.IncludeExceptionDetails = (context, ex) =>
            {
                var environment = context.RequestServices.GetRequiredService<IWebHostEnvironment>();
                return environment.IsDevelopment();
            };

            options.Map<IdentityException>(exception => new ProblemDetails()
            {
                Title = exception.Title,
                Detail = exception.Detail,
                Status = StatusCodes.Status500InternalServerError,
                Type = exception.Type,
                Instance = exception.ToString()
            });

            options.OnBeforeWriteDetails = (ctx, pr) =>
            {
                //here you can do the logging
                logger.LogError("Exception Occurred!!!!");
                logger.LogError(pr.Detail);
                logger.LogError(pr.Instance);
            };
        });

在这里,我使用了一个自定义异常,其中包含响应中的problem details对象所需的额外字段,并使用Instance字段保存并记录异常。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67689705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档