2014-10-08 53 views
3

我使用IExceptionLogger和ExceptionHandler为我的web api服务进行全局记录和错误处理。Web API ExceptionLogger

现在有什么方法可以从ExceptionLoggerContext上下文中读取POST数据。 ?仅仅因为我想保存POST数据以及异常详细信息。

回答

4

我发现的唯一方法是在您的ExceptionLogger/IExceptionLogger实施中解析ExceptionLoggerContext.ExceptionContext

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

有你导航几个嵌套的对象,但在某些时候,你会发现:

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

其中包含与FORM的所有参数的ValueCollection

在我的解决方案,我实现了这样的事情:

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