如何从 HttpActionExecutedContext 获取当前的 HttpContext
How do I get the current HttpContext from a HttpActionExecutedContext
我正在编写一个将异常记录到 Elmah 的异常过滤器,所以我正在做这样的事情:
class ExceptionLoggingFilter : System.Web.Http.Filters.IExceptionFilter
{
public Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actExecContext,
CancellationToken cancellationToken)
{
var httpContext = // what do I do here?
var errorSignal = ErrorSignal.FromContext(httpContext); // this is Elmah
errorSignal.Raise(actExecContext.Exception, httpContext);
}
}
我的问题是我不知道用什么来代替评论问题。我试图探索从方法签名中获得的 HttpActionExecutedContext
的成员树,以找到通往 System.Web.HttpContext
的方法,但我找不到任何方法到达那里。
我如何在这里实现我的目标?
请注意,这可能仅在 WebAPI 托管在 IIS(非自托管)中时有效:
class ExceptionLoggingFilter : System.Web.Http.Filters.IExceptionFilter
{
public Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actExecContext,
CancellationToken cancellationToken)
{
//var httpContext = // what do I do here? NOTHING
var errorSignal = ErrorSignal.FromCurrentContext(); // this is Elmah
errorSignal.Raise(actExecContext.Exception);
}
}
Elmah.ErrorSignal.FromCurrentContext()
在幕后使用 HttpContext.Current
,因此尽管 可能 有效,但我确实找到了更好的(尽管更迂回)方法:
var request = actionExecutedContext.Request;
object value;
if (request == null
|| !request.Properties.TryGetValue("MS_HttpContext", out value)
|| !(value is HttpContextBase))
return null; // Actually I'm returning a Maybe monad here but that's off topic...
}
var httpContextBase = value as HttpContextBase;
return httpContextBase.ApplicationInstance.Context;
我将它与一个可能的 monad 实现一起使用,它让我可以使用 ErrorSignal.FromCurrentContext()
作为后备,到目前为止它运行良好。
我正在编写一个将异常记录到 Elmah 的异常过滤器,所以我正在做这样的事情:
class ExceptionLoggingFilter : System.Web.Http.Filters.IExceptionFilter
{
public Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actExecContext,
CancellationToken cancellationToken)
{
var httpContext = // what do I do here?
var errorSignal = ErrorSignal.FromContext(httpContext); // this is Elmah
errorSignal.Raise(actExecContext.Exception, httpContext);
}
}
我的问题是我不知道用什么来代替评论问题。我试图探索从方法签名中获得的 HttpActionExecutedContext
的成员树,以找到通往 System.Web.HttpContext
的方法,但我找不到任何方法到达那里。
我如何在这里实现我的目标?
请注意,这可能仅在 WebAPI 托管在 IIS(非自托管)中时有效:
class ExceptionLoggingFilter : System.Web.Http.Filters.IExceptionFilter
{
public Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actExecContext,
CancellationToken cancellationToken)
{
//var httpContext = // what do I do here? NOTHING
var errorSignal = ErrorSignal.FromCurrentContext(); // this is Elmah
errorSignal.Raise(actExecContext.Exception);
}
}
Elmah.ErrorSignal.FromCurrentContext()
在幕后使用 HttpContext.Current
,因此尽管 可能 有效,但我确实找到了更好的(尽管更迂回)方法:
var request = actionExecutedContext.Request;
object value;
if (request == null
|| !request.Properties.TryGetValue("MS_HttpContext", out value)
|| !(value is HttpContextBase))
return null; // Actually I'm returning a Maybe monad here but that's off topic...
}
var httpContextBase = value as HttpContextBase;
return httpContextBase.ApplicationInstance.Context;
我将它与一个可能的 monad 实现一起使用,它让我可以使用 ErrorSignal.FromCurrentContext()
作为后备,到目前为止它运行良好。