2015-02-06 4 views
2

Я пишу фильтр исключений, который будет регистрировать исключения Elmah, так что я делаю что-то вроде этого:Как я могу получить текущий HttpContext от HttpActionExecutedContext

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); 
    } 
} 

Моя проблема заключается в том, что я не» t знать, что поставить вместо вопроса комментариев. Я попытался изучить дерево-член HttpActionExecutedContext, которое я получаю от сигнатуры метода, чтобы найти способ для System.Web.HttpContext, но я не могу найти способ добраться туда.

Как я могу выполнить свою цель здесь?

+0

'ApiController' не использует' HttpContext' или 'HttpContextBase'. Вы можете обратиться к ним с помощью 'HttpContext.Current', но только тогда, когда webapi размещен в IIS. Если вы размещаете в IIS, я считаю, что вы можете просто выполнить 'ErrorSignal.FromCurrentContext()' или следовать за ответом Джоанво. – danludwig

+0

@danludwig: Я запускаю это в IIS, так что, вероятно, это сработает. –

ответ

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

Я использую это вместе с возможно монаду реализации этого ль ts me использует ErrorSignal.FromCurrentContext() как запасной, и до сих пор он работал хорошо.

0

Примечания это вероятно, будет работать только тогда, когда 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); 
    } 
} 
+0

Я хостинг в IIS, так что, вероятно, сработает. Я могу проверить, когда я вернусь к работе в понедельник =) –

Смежные вопросы