我正在使用IExceptionLogger和ExceptionHandler为我的web api服务全局记录和错误处理。
现在有没有办法从ExceptionLoggerContext上下文中读取POST数据。 ?仅仅因为我想保存POST数据以及异常细节。
答案 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中,我定义了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