我使用IExceptionLogger和ExceptionHandler为我的web api服务进行全局记录和错误处理。Web API ExceptionLogger
现在有什么方法可以从ExceptionLoggerContext上下文中读取POST数据。 ?仅仅因为我想保存POST数据以及异常详细信息。
我使用IExceptionLogger和ExceptionHandler为我的web api服务进行全局记录和错误处理。Web API ExceptionLogger
现在有什么方法可以从ExceptionLoggerContext上下文中读取POST数据。 ?仅仅因为我想保存POST数据以及异常详细信息。
我发现的唯一方法是在您的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中,我定义了我的自定义实现IExceptionLogger
和IExceptionHandler
。
在这个示例应用程序中,我用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