Свойство InvocationTarget
экземпляра IInvocation
содержит целевой объект. Так что в вашем случае, если вы уверены, что перехват происходит на Page
объекте, вы должны быть в состоянии сделать это:
var page = (Page)invocation.InvocationTarget;
Если это не всегда так, вы должны получить доступ к HTTP-контексту другим способом.
Это верно, как указывает Бен, что HttpContext.Current
дает вам доступ к текущему HttpContext
из любого места, но доступ к этому статическому свойству просто неприличен. Однако есть и лучший способ - зарегистрировать фабричный метод, который позволяет вводить состояние сеанса:
container.Register(
Component.For<ISessionState>()
.UsingFactoryMethod(k => new SessionWrapper(HttpContext.Current.Session)
.Lifestyle.PerWebRequest));
при условии, что вы создали интерфейс ISessionState
и соответствующую оболочку с API, который вы хотите использовать при взаимодействии с объектом ASP.NET HttpSessionState
.
Теперь, поскольку перехватчик извлекается из контейнера, как и все остальное, он может зависеть от ISessionState
:
public class SecurityInterceptor : IInterceptor
{
public SecurityInterceptor(ISessionState sessionState)
{
//...
}
}
, что делает ваш перехватчик красивым и тестируемым.
Возможно, есть много других способов сделать это, а также, возможно, и лучшие. Это просто идея о том, как вы можете продолжить свой проект:)