如何从HttpActionExecutedContext获取当前的HttpContext

4
我正在编写一个异常过滤器,用于将异常记录到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
@danludwig:我正在IIS中运行这个托管,所以那应该可以工作。 - Tomas Aschan
2个回答

5
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;

我将其与一个Maybe Monad实现一起使用,这使我可以使用ErrorSignal.FromCurrentContext()作为备用选项,到目前为止它运作良好。


0

请注意,这可能仅适用于在IIS中托管WebAPI(而不是自托管):

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上托管,所以那可能会起作用。我可以在周一回到工作时进行验证 =) - Tomas Aschan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接