我使用elmah.io记录asp.net核心应用程序中的错误:
app.UseElmahIo("API_KEY", new Guid("LOG_ID"));它只是一个中间件,它看起来像:
public async Task Invoke(HttpContext context)
{
try
{
await _next.Invoke(context);
await MessageShipper.ShipAsync(_apiKey, _logId, "Unsuccessful status code in response", context, _settings);
}
catch (Exception exception)
{
await exception.ShipAsync(_apiKey, _logId, context, _settings);
throw;
}
}此外,我还有我的自定义ExceptionFilter来处理错误并向客户端返回特定的消息:
public class ApiExceptionFilter : ExceptionFilterAttribute
{
private ApiError _apiError;
public override void OnException(ExceptionContext context)
{
if (context.Exception is ApiException)
{
HandleKnownError(context);
}
else if (context.Exception is UnauthorizedAccessException)
{
HandleUnauthorizedException(context);
}
else
{
UnhandeledException(context);
}
context.Result = new JsonResult(_apiError);
base.OnException(context);
}
private void UnhandeledException(ExceptionContext context)
{
var msg = context.Exception.GetBaseException().Message;
string stack = context.Exception.StackTrace;
_apiError = new ApiError(msg) {Detail = stack};
context.HttpContext.Response.StatusCode = 500;
}
private void HandleKnownError(ExceptionContext context)
{
var ex = context.Exception as ApiException;
context.Exception = null;
_apiError = new ApiError(ex.Message);
context.HttpContext.Response.StatusCode = ex.StatusCode;
}
}在这种情况下,如果我在某个地方抛出异常,在elmah.io中我只会看到消息Unsuccessful status code in response。我相信这是因为我的ApiExceptionFilter首先处理异常,而elmah中间件没有异常,只是状态不好。如何解决这个问题?
PS。Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.Configure<Settings>(Configuration);
ConfigureCors(services);
services.AddMvc(o =>
{
o.Filters.Add(new ApiResponseWrapper());
o.Filters.Add(typeof(ApiExceptionFilter));
})
... a lot of my services
}
public void Configure(IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory,
IServiceProvider serviceProvider)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
var logPath = Path.Combine(env.WebRootPath, "Logs/App-log-{Date}.txt");
loggerFactory.AddFile(logPath);
app.UseElmahTo("API",new Guid("LOG_ID"));
app.UseCors("CorsPolicy");
ConfigureAuth(app, env);
app.UseMvc();
}发布于 2017-07-20 06:37:58
您正确地认识到,您的异常过滤器在执行elmah.io中间件之前吞噬了异常。您通常会添加elmah.io中间件作为链中的最后一个,以确保其他中间件的行为不像这样。但在您的示例中,在elmah.io收到错误通知之前将执行筛选器。
你可以通过以下方式解决这个问题:
UnhandledException:private void UnhandeledException(ExceptionContext context)
{
context.Exception.Ship("API_KEY", new System.Guid("LOG_ID"), context.HttpContext);
var msg = context.Exception.GetBaseException().Message;
string stack = context.Exception.StackTrace;
_apiError = new ApiError(msg) { Detail = stack };
context.HttpContext.Response.StatusCode = 500;
}https://stackoverflow.com/questions/45197201
复制相似问题