C# ASP.NET Web API全局异常处理-堆栈跟踪可读性

C# ASP.NET Web API全局异常处理-堆栈跟踪可读性,c#,asp.net,exception,asp.net-web-api,C#,Asp.net,Exception,Asp.net Web Api,我正在从事一个ASP.NETWebAPI项目(.NETFramework 4.7.1) 我正在尝试使用ExceptionLogger全局处理异常并记录它们 我的实现如下所示: public class MyExceptionLogger : ExceptionLogger { public override void Log(ExceptionLoggerContext context) { Console.Error.WriteLine(context.Exce

我正在从事一个ASP.NETWebAPI项目(.NETFramework 4.7.1)

我正在尝试使用ExceptionLogger全局处理异常并记录它们

我的实现如下所示:

public class MyExceptionLogger : ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        Console.Error.WriteLine(context.Exception);
    }
}
public static void Register(HttpConfiguration config)
{
    // Configuration et services API Web
    config.Services.Add(typeof(IExceptionLogger), new MyExceptionLogger());

    [...]
}
我将其订阅到WebApiConfig.cs,如下所示:

public class MyExceptionLogger : ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        Console.Error.WriteLine(context.Exception);
    }
}
public static void Register(HttpConfiguration config)
{
    // Configuration et services API Web
    config.Services.Add(typeof(IExceptionLogger), new MyExceptionLogger());

    [...]
}
它很好地捕获了来自控制器的未捕获异常,但堆栈跟踪似乎过于冗长:

   at WebApplication.Controllers.ValuesController.Get() in [...]\source\repos\WebApplication\WebApplication\Controllers\ValuesController.cs:line 15
   at lambda_method(Closure , Object , Object[] )
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()
[…]\source\repos\WebApplication\WebApplication\Controllers\valuescoontroller.Get()中的WebApplication.Controllers.valuescoontroller.Get()中的
:第15行
在lambda_方法(闭包、对象、对象[])
在System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.c\u DisplayClass10.b\u 9(对象实例,对象[]方法参数)
位于System.Web.Http.Controller.ReflectedHttpActionDescriptor.ActionExecutor.Execute(对象实例,对象[]参数)
位于System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext,IDictionary`2参数,CancellationToken CancellationToken)
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Web.Http.Controllers.ApiControllerActionInvoker.d_u0.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Web.Http.Controllers.ActionFilterResult.d_u2.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Web.Http.Dispatcher.HttpControllerDispatcher.d_u1.MoveNext()中
——来自引发异常的上一个位置的堆栈结束跟踪---”中的部分使堆栈跟踪沉重且不易读取 它似乎与某些异步代码有关,但我的控制器没有任何异步代码:

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        throw new Exception("Test");
        return new string[] { "value1", "value2" };
    }
}
公共类值控制器:ApiController
{
//获取api/值
公共IEnumerable Get()
{
抛出新异常(“测试”);
返回新字符串[]{“value1”,“value2”};
}
}
是否有任何方法可以获得“更可读”的堆栈跟踪

我检查了此线程,但解释的解决方案都不适用于我的项目:
每个
异常
都可能有一个
内部异常
,因此您还需要检查
内部异常

while(exception != null)
{
   Console.Error.WriteLine(exception);
   if(exception.InnerException != null)
      exception = exception.InnerException;
}
编辑1:

Ben Adams最近开发了一个软件包,可以使异常更具可读性:

您可以使用System.Diagnostic中的StackTrace类,然后可以将异常写入其他地方。此类帮助您读取带有文件名和行号的stackTrace


不幸的是,InnerException为NULL,而且我觉得对本机的东西使用扩展不太舒服