在我的Hellang应用程序中,我使用Middleware进行异常处理作为全局异常处理机制。我在Startup.cs的ConfigureServices方法中添加了以下代码:
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中间件进行异常处理和日志记录?
发布于 2021-11-16 14:50:35
我也遇到过类似的问题。我像下面这样解决了这个问题。在此示例中,记录自定义业务故障异常:
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
};
});
});
发布于 2021-06-02 15:59:13
答案在这里:https://stackoverflow.com/a/40153711/90287
您必须区分请求的类型,是应用程序接口请求还是用户界面请求,以分别确定是否应返回problem+details JSON或是否应返回网页。
这就是我在Startup.cs
的Configure
方法的顶部附近所做的事情
app.UseWhen(context => context.IsApiRequest(), branch =>
{
branch.UseProblemDetails();
});
app.UseWhen(context => !context.IsApiRequest(), branch =>
{
branch.UseExceptionHandler("/Home/Error");
});
您可以定义自己的自定义HttpContext扩展方法:
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
}
}
发布于 2021-06-09 13:48:18
这不完全是您问题的答案,但我在Web API应用程序中遇到了类似的问题,涉及到使用ExceptionHandler中间件和Hellang ProblemDetails中间件,我也意识到我不能同时使用它们,因为它们以各自的方式更改响应,并相互影响。
根据文档here,您可以在更改响应之前使用ProblemDetails包的一个配置选项来执行代码,并且可以在那里记录所需的所有信息。
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字段保存并记录异常。
https://stackoverflow.com/questions/67689705
复制相似问题