Получить текущую System.Web.UI.Page из HttpContext?

Это вопрос двух частей. Во-первых, соответствует ли HttpContext.Current текущему объекту System.UI.Page?

И второй вопрос, который, вероятно, связан с первым, заключается в том, почему я не могу использовать следующее, чтобы увидеть, реализует ли текущая страница интерфейс:

private IWebBase FindWebBase()
{
    if (HttpContext.Current as IWebBase != null)
    {
        return (IWebBase)HttpContext.Current.;
    }
    throw new NotImplementedException("Crawling for IWebBase not implemented yet");
}

Общий контекст: некоторые элементы управления должны знать, выполняются ли они как веб-узел SharePoint или как часть структуры Asp.Net.

Я решил проблему, потребовав, чтобы элемент управления передал ссылку на себя и проверил свойство страницы элемента управления, но мне все еще интересно, почему это не работает.

Ошибка компилятора: Невозможно преобразовать System.Web.HttpContext в... IWebBase через ссылочное преобразование, преобразование бокса, преобразование распаковки, конвертирование конверсий или преобразование нулевого типа.

Ответ 1

Нет, из MSDN в HttpContext.Current: "Получает или задает объект HttpContext для текущего HTTP-запроса".

Другими словами, это объект HttpContext, а не страница.

Вы можете попасть в объект страницы через HttpContext, используя:

Page page = HttpContext.Current.Handler as Page;

if (page != null)
{
     // Use page instance.
}

Ответ 2

Вы ищете HttpContext.Handler. Поскольку страница реализует IHttpHandler, вы получите ссылку на текущую исполняемую страницу. Вам придется ее бросить или, по крайней мере, попытаться применить ее к определенному типу, который вы ищете.

HttpContext.Current просто возвращает экземпляр singleton HttpContext. Следовательно, это не так и не может быть, страница.

Ответ 3

Вы можете использовать HttpContext.Current.CurrentHandler, если вам нужна точная страница, которая в настоящее время выполняется. Например, отправляется запрос по умолчанию .aspx, но возникает ошибка, и вы делаете Response.Transfer на свою страницу ErrorHandler.aspx. CurrentHandler вернет экземпляр ErrorHandler.aspx(если вызвано после ошибки), тогда как HttpContext.Current.Handler вернет экземпляр Default.aspx.