[英]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.