【问题标题】:How do I get the current HttpContext from a HttpActionExecutedContext如何从 HttpActionExecutedContext 获取当前的 HttpContext
【发布时间】:2015-02-06 16:32:48
【问题描述】:

我正在编写一个异常过滤器,它将向 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 的方法,但我找不到任何方法。

我如何在这里实现我的目标?

【问题讨论】:

  • ApiController 不使用HttpContextHttpContextBase。您可以使用HttpContext.Current 访问它们,但仅当 webapi 托管在 IIS 中时。如果您在 IIS 中托管,我相信您可以这样做 ErrorSignal.FromCurrentContext(),或者按照 Joanvo 的回答。
  • @danludwig:我在 IIS 中运行它,所以它可能会工作。

标签: asp.net asp.net-web-api httpcontext


【解决方案1】:
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() 作为后备,到目前为止它运行良好。

【讨论】:

    【解决方案2】:

    请注意,这可能仅在 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);
        }
    }
    

    【讨论】:

    • 我在 IIS 中托管,所以这可能会起作用。我可以确认我周一什么时候回去工作 =)
    猜你喜欢
    • 2010-09-08
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多