[英]ASP.Net Core 2 error handling: How to return formatted exception details in Http Response?
我正在寻找一种方法来返回调用我的 Web API 的方法时发生的任何异常的详细信息。
默认情况下,在生产环境中,错误 500“内部服务器错误”是 API 返回的唯一信息。
它是一个不通过 Internet 发布的私有 API,调用方应用程序需要获取和存储所有详细信息,以防万一。
异常详细信息可以是HttpResponse内容中的JSON格式,允许调用者读取Message属性和异常的StackTraceString属性(没有像UseDeveloperExceptionPage配置的 HTTP 页面)。
目前默认的启动配置方法是:
public class Startup
{
[...]
public void Configure(IApplicationBuilder app, IHostingEnvironment env, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory)
{
loggerFactory.AddNLog();
env.ConfigureNLog(Path.Combine(AppContext.BaseDirectory, "nlog.config"));
if ( env.IsDevelopment() )
app.UseDeveloperExceptionPage();
else
app.UseStatusCodePages();
app.UseMvc();
}
}
您可以编写一个自定义中间件,它拦截所有异常并将它们返回给调用者:
public class ExceptionHandler
{
private readonly RequestDelegate _next;
public ExceptionHandler(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
try
{
await _next.Invoke(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private async Task HandleExceptionAsync(HttpContext context, Exception exception)
{
var response = context.Response;
response.ContentType = "application/json";
response.StatusCode = (int)HttpStatusCode.InternalServerError;
await response.WriteAsync(JsonConvert.SerializeObject(new
{
// customize as you need
error = new
{
message = exception.Message,
exception = exception.GetType().Name
}
}));
}
}
并在您的启动配置方法中注册它:
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
else
app.UseMiddleware<ExceptionHandler>();
作为中间件的替代方案,您可以创建 ActionFilterAttribute 并更改 IActionResult
这是一个简单的示例属性,对于所有未处理的异常,使用 Exception 方法返回 400 Bad request。
public class MyUnhandledExceptionFilter : ActionFilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext context)
{
context.Result = new BadRequestObjectResult(context.Exception.Message);
}
}
然后您在启动的 ConfigureServices 方法中注册它,如下所示
services.AddMvc(options =>
{
options.Filters.Add(typeof(MyUnhandledExceptionFilter));
})
这只会捕获到达 MVC 的异常,这在大多数情况下是您需要的
请记住在 UseMvc(或 .Net Core 3 中的 UseRouting)之前添加它,因为顺序很重要!!!!!!
app.UseRouting ();
app.UseMiddleware (typeof (ErrorHandlingMiddleware));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.