我正在使用ASP.NET Core开发API,我正在努力处理异常处理.
当发生任何异常时,或者在我想要返回具有不同状态代码的自定义错误的任何控制器中时,我想返回JSON格式的异常报告.我在错误响应中不需要HTML.
我不确定我是否应该使用中间件或其他东西.我应该如何在ASP.NET Core API中返回JSON异常?
我有 .net 5 api,它可以在我的计算机上运行,但不能在 Azure 应用服务上运行。看起来它无法编写响应,下面是异常堆栈跟踪和启动代码。我正在使用 System.Text.Json。我不确定是什么导致了这个问题。我可以看到控制器操作已执行,因此反序列化在传入过程中工作正常。写入响应时失败。
具体来说,它在调用自定义中间件中的 move next 时出错,该中间件调用身份验证中间件,如 Stacktrace 中所示。
CheckRequestHeaderMiddleware+<Invoke>d__6.MoveNext
Run Code Online (Sandbox Code Playgroud)
控制器动作方法:
try
{
request.IdFromToken = GetIdFromToken();
if (!await IsValidAsync(request, _requestValidator))
{
return BadRequest(ModelState);
}
if (!Request.Headers.Keys.Contains("X-ClientId"))
{
return BadRequest("Header X-ClientId is missing");
}
else
{
request.ClientId = Guid.Parse(Request.Headers["X-ClientId"]);
}
// Encoding to prevent xss attack
xssValidation.xssHtmlEncoding(request);
var serializedMessage = JsonSerializer.Serialize(request);
await _messagePublisher.SendAsync(serializedMessage);
return Ok();
}
catch (BadRequestException ex)
{
ModelState.AddModelError(string.Empty, ex.Message);
return BadRequest(ModelState);
}
catch (Exception ex)
{
return StatusCode(StatusCodes.Status500InternalServerError,ex);
}
Run Code Online (Sandbox Code Playgroud)
System.NotSupportedException:
at System.Text.Json.ThrowHelper.ThrowNotSupportedException (System.Text.Json, Version=5.0.0.0, …Run Code Online (Sandbox Code Playgroud)