Asp.net web api 从ExceptionLogger引用操作参数

Asp.net web api 从ExceptionLogger引用操作参数,asp.net-web-api,asp.net-web-api2,Asp.net Web Api,Asp.net Web Api2,我想利用新方法全局记录错误。我编写了一个类,它继承了ExceptionLogger并重写了Log()方法。然后注册为替代品 public class TraceExceptionLogger : ExceptionLogger { public async override void Log(ExceptionLoggerContext context) { // This is always empty string var content =

我想利用新方法全局记录错误。我编写了一个类,它继承了
ExceptionLogger
并重写了
Log()
方法。然后注册为替代品

public class TraceExceptionLogger : ExceptionLogger
{
    public async override void Log(ExceptionLoggerContext context)
    {
        //  This is always empty string
        var content = await context.Request.Content.ReadAsStringAsync();

        //  This is almost always null
        var actionContext = context.ExceptionContext.ActionContext;
    }
}
我可以深入研究
ExceptionLoggerContext
对象的属性,以获得几乎所有我需要的东西,除了动作参数。确实有一个
ActionContext
属性,但我只看到它为null,并且声明
ActionContext
ControllerContext
几乎总是null

此外,我无法获取内容流,因为它的流在到达我的记录器之前已经被读取。因此,我无法从请求的内容中获取任何发布的json


是否有一种方法可以从HttpContext.Current或其他方式获取发布的数据?

好的,看起来我可以通过读取请求对象上的InputStream从HttpContext获取正文,如下所示:

string bodyText = string.Empty;

using (var sr = new StreamReader(HttpContext.Current.Request.InputStream))
{
    sr.BaseStream.Seek(0, SeekOrigin.Begin);
    bodyText = sr.ReadToEnd();
}

到目前为止,这段代码成功地让我获得了发布的json数据。

以下是操作参数,供将来参考

public class HomeController : ApiController {
    public string Get(string id, [FromHeader] Whoever whoever) {

    public string Post(Whatever whatever) {


var args = ((ApiController) context.ExceptionContext
           .ControllerContext.Controller)).ActionContext.ActionArguments

if (args.ContainsKey("whatever")) {
   var whatever = (Whatever)args["whatever"];

你救了我的命!我正要自杀。无法记录请求内容是非常令人沮丧的。@StefanVasiljevic我很高兴它起了作用,我救了你的命。我想这是我的代码第一次这么做,哈哈。干杯@这不是最后一次!2017年11月,仍然在拯救生命@阿喀琉斯,这根本不是一个愚蠢的问题。这是一个非常有效的调查。HttpContext和HttpContext.Current是静态的。因此,你可以在任何给定的时间访问当前上下文。你真是太棒了!非常感谢。