注意:這個問題是關於elmah.io(https://elmah.io/),基於雲的異常記錄服務,而不是傳統的Elmah .Net庫。如何使elmah.io在ASP.NET Core和錯誤處理中間件上運行良好?
我正在使用ASP.NET Core並有一個簡單的異常處理中間件。
public class HandleExceptionMiddleware
{
public HandleExceptionMiddleware(RequestDelegate next)
{
Next = next;
}
RequestDelegate Next { get; }
public async Task Invoke(HttpContext httpContext)
{
try
{
await Next(httpContext);
}
catch (Exception ex)
{
await HandleExceptionAsync(httpContext, ex);
}
}
Task HandleExceptionAsync(HttpContext context, Exception ex)
{
var code = HttpStatusCode.InternalServerError;
if (ex is ArgumentException)
code = HttpStatusCode.BadRequest;
var result = JsonConvert.SerializeObject(new { message = ex.Message });
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)code;
return context.Response.WriteAsync(result);
}
}
這個中間件將返回取決於例外以下JSON響應,它認爲:
對於ArgumentException的:
HTTP/1.1 400 Bad Request
{"message":""}
對於所有其它異常:
HTTP/1.1 500 Internal Server Error
{"message":""}
我'd像elmah.io登錄500
迴應並忽略400
響應(這是默認的elmah.io配置)。然而,當異常處理程序和elmah.io在啓動時的配置掛鉤這個命令被註冊,沒有東西在elmah.io登錄:
app.UseElmahIo("API_KEY", new Guid("LOG_ID"));
app.UseMiddleware<HandleExceptionMiddleware>()
但是,如果我變更登記爲以下,一切變得記錄(包括400個回覆)。這使得作爲elmah.io處理HandleExceptionMiddleware
前的異常都有機會改變響應的感覺:
app.UseMiddleware<HandleExceptionMiddleware>()
app.UseElmahIo("API_KEY", new Guid("LOG_ID"));
什麼是配置這些服務,使elmah.io日誌500個迴應並忽略400個反應的最好方法?
我想出的唯一解決方法是創建並註冊2個異常處理中間件而不是1個。一個之前註冊,另一個註冊在elmah.io之後。它的工作原理,但似乎有點難看:
app.UseMiddleware<HandleInternalExceptionMiddleware>() // set 500 responses (these will have already been logged in elmah.io)
app.UseElmahIo("API_KEY", new Guid("LOG_ID"));
app.UseMiddleware<HandleExternalExceptionMiddleware>() // set 400 responses but ignore exceptions that should return 500 (these won't be logged in elmah.io)
我創建了一個示例項目在這裏演示此行爲: https://github.com/johnnyoshika/elmah-io-experiment
很好的回答!我學到了很多東西。我曾經想過,因爲默認情況下,elmah.io會記錄500個響應,所以我不必將500添加到HandledStatusCodesToLog列表中。我現在已經瞭解到,當列表中有500個時,行爲是不同的。就像你說的,解決方案2絕對不是很好的B/C堆棧跟蹤將不會被記錄。解決方案1更好,它會解決我的問題,但我認爲我會堅持使用2中間件方法,因爲這樣,我不需要在2個地方維護相同的規則。 –