Web API ExceptionLogger

时间:2014-10-08 19:49:03

标签: asp.net-web-api

我正在使用IExceptionLogger和ExceptionHandler为我的web api服务全局记录和错误处理。

现在有没有办法从ExceptionLoggerContext上下文中读取POST数据。 ?仅仅因为我想保存POST数据以及异常细节。

1 个答案:

答案 0 :(得分:5)

我找到的唯一方法是解析ExceptionLoggerContext.ExceptionContext / ExceptionLogger实施中的IExceptionLogger

ExceptionLoggerContext.ExceptionContext的类型为System.Web.Http.ExceptionHandling.ExceptionContext

您必须导航一些嵌套对象,但在某些时候,您会发现:

((System.Web.Http.ApiController)exceptionContext.ControllerContext.Controller).ActionContext.ActionArguments

其中包含ValueCollection,其中包含FORM的所有参数。

在我的解决方案中,我实现了类似的东西:

public class MyExceptionContext
    {
    public Dictionary<string, object>.ValueCollection ActionArguments { get; set; }

    public MyExceptionContext(System.Web.Http.ExceptionHandling.ExceptionContext exceptionContext)
    {
        try
        {
        this.ActionArguments = ((System.Web.Http.ApiController)exceptionContext.ControllerContext.Controller).ActionContext.ActionArguments.Values;
        }
        catch (Exception)
        {
        }
    }
}

我传递了我的构造函数ExceptionLoggerContext.ExceptionContext;它会填充字典ActionArguments并张贴所有值。

您可以在Github上找到demo project。它是一个自托管(owin)web.api应用程序。 在我的Startup中,我定义了IExceptionLoggerIExceptionHandler的自定义实现。

在这个示例应用程序中,我使用了Serilog在磁盘上传输异常。

如果您尝试将表单发布到测试控制器,我将throw an exception将被全局处理程序捕获并保留在文件系统上并带有一些信息。

如果您下载并运行Github中的示例,您可以使用Fiddler对其进行测试:

POST http://localhost:9667/api/exception HTTP/1.1
User-Agent: Fiddler
Content-Type: application/x-www-form-urlencoded
Host: localhost:9667
Content-Length: 40

username=stackoverflow&password=password