powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / SharePoint [игнор отключен] [закрыт для гостей] / GetCompiledPageInstance() on SharePoint site
15 сообщений из 15, страница 1 из 1
GetCompiledPageInstance() on SharePoint site
    #34549747
_SZ_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi, All,

Пишу свой HttpHandler для SharePoint сайта.
Ниже представлена часть реализации ProcessRequest метода, в выделенной строке которого возникает эксепшен.

The file "\Folder\Page.aspx" not found.


public void ProcessRequest(HttpContext context)
{
    string page = context.Request.AppRelativeCurrentExecutionFilePath;
    string inputFile = context.Server.MapPath(page);

     IHttpHandler httpHandler = PageParser.GetCompiledPageInstance(page, inputFile, context);
    // ...

inputFile = "C:\Inetpub\wwwroot\wss\VirtualDirectories\MySite\Folder\Page.aspx".

По этому пути файла нет, поэтому эксепшен вполне закономерный.

Но директория и страница были добавлены через SharePoint Designer и SharePoint вэб интерфейс и лежат в базе.

Есть идеи, как можно обойти это препятствие?
...
Рейтинг: 0 / 0
GetCompiledPageInstance() on SharePoint site
    #34550240
Sinclair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, _SZ_, Вы писали:
_SZ>Но директория и страница были добавлены через SharePoint Designer и SharePoint вэб интерфейс и лежат в базе.
_SZ>Есть идеи, как можно обойти это препятствие?
Есть идея почитать вокруг virtual path provider. С ним, возможно, свой хэндлер и не понадобится.... << RSDN@Home 1.2.0 alpha rev. 677>>
...
Рейтинг: 0 / 0
GetCompiledPageInstance() on SharePoint site
    #34552384
_SZ_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, _SZ_, Вы писали:
_SZ>>Но директория и страница были добавлены через SharePoint Designer и SharePoint вэб интерфейс и лежат в базе.
_SZ>>Есть идеи, как можно обойти это препятствие?
S>Есть идея почитать вокруг virtual path provider. С ним, возможно, свой хэндлер и не понадобится.

Почитал... проникся... прикольный монстр, но пристроить его пока некуда...

Задачка тривиальная и не шарпоинт сервере схема уже работала.

На странице а1.aspx есть линки на страницы b1.aspx, b2.aspx, b2.aspx и т.д.

Но реально этих страниц нет вообще — есть только страница a2.aspx.

Хэндлер перехватывает запрос и создаёт новый, например — a2.aspx?page=b1, и переписывает урл в оригинальный, т.е. в b1.aspx.

Страница a2.aspx понятное дело знает, как это всё дело обрабатывать.


context.RewritePath(context.Request.Path, string.Empty, queryString);
httpHandler = (Page)PageParser.GetCompiledPageInstance(page, context.Server.MapPath(page), context);
httpHandler.PreRenderComplete += new EventHandler(Page_PreRenderComplete);
httpHandler.ProcessRequest(context);

Метод GetCompiledPageInstance нужен для создания инстанса страницы, которая выполнит потом ProcessRequest.

Неспрашивайте, зачем эта вся беда вообще стала нужна — так захотел заказчик...

Как я описывал выше — методом GetCompiledPageInstance у меня не получается создать инстанс страницы.
virtual path provider возможно в этом поможет, а возможно и нет — не проверял — так как если он вытянет объект типа SPFile, я понятия не имею, как потом сделать ProcessRequest. В любом случае провайдер довольнообъёмная штука для такой задачи.

Появилась мысль использовать HttpModule c Responce.Redirect на BeginRequest... пока думаю...
...
Рейтинг: 0 / 0
GetCompiledPageInstance() on SharePoint site
    #34554303
Sinclair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, _SZ_, Вы писали:

_SZ>Метод GetCompiledPageInstance нужен для создания инстанса страницы, которая выполнит потом ProcessRequest.
Вот с этого места непонятно. GetCompiledPageInstance делается для a2.aspx? Почему тогда его нет, ты же говоришь что есть такая страница?

_SZ>Неспрашивайте, зачем эта вся беда вообще стала нужна — так захотел заказчик...

_SZ>Как я описывал выше — методом GetCompiledPageInstance у меня не получается создать инстанс страницы.

_SZ>virtual path provider возможно в этом поможет, а возможно и нет — не проверял — так как если он вытянет объект типа SPFile, я понятия не имею, как потом сделать ProcessRequest.
Virtual Path Provider поможет GetCompiledPageInstance найти страничку, которой нет в файловой системе. Его надо не использовать, а реализовывать.
_SZ>В любом случае провайдер довольнообъёмная штука для такой задачи.
Да ну. Не шибко-то он объемный.
_SZ>Появилась мысль использовать HttpModule c Responce.Redirect на BeginRequest... пока думаю...
Внятно опиши задачу. Скорее всего, для нее заранее предусмотрен человеческий метод.... << RSDN@Home 1.2.0 alpha rev. 677>>
...
Рейтинг: 0 / 0
GetCompiledPageInstance() on SharePoint site
    #34557661
_SZ_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Sinclair, Вы писали:

_SZ>>Появилась мысль использовать HttpModule c Responce.Redirect на BeginRequest... пока думаю...
S>Внятно опиши задачу. Скорее всего, для нее заранее предусмотрен человеческий метод.

Оки... давай внятно...

Есть две странички в виртуальной файловой системе SharePoint'a, назовём их а1.aspx и а2.aspx.

На страничке а1.aspx нет прямых ссылок на страничку а2.aspx, а есть только ссылки на несуществующие, в принципе, странички b1.aspx, b2.aspx, b3.aspx и т.д.

При клике по этим ссылкам должна открываться страничка а2.aspx с необходимым ключом, например — а2.aspx?id=b1, страничка а2.aspx знает, как ей обрабатывать полученный ключ.

Однако в строке ввода URL адреса браузера должнен будет отобразиться адрес странички b1.aspx.

-------------------------------------------------------

Был уже готов HttpHandler, который работал, но не был расчитан на виртуальную файловую систему — не мог сработать GetCompiledPageInstance для a2.aspx.
Использование Virtual Path Provider наверняка поможет в этом (раз ты так утверждаешь ;) ).

HttpModule c Server.Transfer на BeginRequest тоже работает так, как надо...

Если есть идеи более человеческого метода — всегда рад учиться :)
...
Рейтинг: 0 / 0
GetCompiledPageInstance() on SharePoint site
    #34557740
Sinclair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, _SZ_, Вы писали:

_SZ>При клике по этим ссылкам должна открываться страничка а2.aspx с необходимым ключом, например — а2.aspx?id=b1, страничка а2.aspx знает, как ей обрабатывать полученный ключ.
Это всё понятно. Стандартный Url Rewrite.
_SZ>Однако в строке ввода URL адреса браузера должнен будет отобразиться адрес странички b1.aspx.
А какой именно адрес у странички b1.aspx?
_SZ>Был уже готов HttpHandler, который работал, но не был расчитан на виртуальную файловую систему — не мог сработать GetCompiledPageInstance для a2.aspx.
А для какой странички GetCompiledPageInstance срабатывал?
_SZ>HttpModule c Server.Transfer на BeginRequest тоже работает так, как надо...
А куда делается Server.Transfer? Есть подозрение, что он просто пользуется VirtualPathProvider, который уже и так реализован шарепоинтом. Каким-то способом ведь виртуальные странички работают, так? Я просто с шарепоинтом никогда не работал.
_SZ>Если есть идеи более человеческого метода — всегда рад учиться :)
Ну, скорее всего человеческий метод именно в Server.Transfer. Хотя его, наверное, можно было сделать и в хэндлере.... << RSDN@Home 1.2.0 alpha rev. 677>>
...
Рейтинг: 0 / 0
GetCompiledPageInstance() on SharePoint site
    #34558364
_SZ_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, _SZ_, Вы писали:

_SZ>>При клике по этим ссылкам должна открываться страничка а2.aspx с необходимым ключом, например — а2.aspx?id=b1, страничка а2.aspx знает, как ей обрабатывать полученный ключ.
S>Это всё понятно. Стандартный Url Rewrite.

Походу — да.

_SZ>>Однако в строке ввода URL адреса браузера должнен будет отобразиться адрес странички b1.aspx.
S>А какой именно адрес у странички b1.aspx?

Без заморочек — тот же лэвэл что и у a2.aspx, например http://server/folder/b1.aspx , вместо http://server/folder/ а2.aspx

_SZ>>Был уже готов HttpHandler, который работал, но не был расчитан на виртуальную файловую систему — не мог сработать GetCompiledPageInstance для a2.aspx.
S>А для какой странички GetCompiledPageInstance срабатывал?

Он срабатывал для a2.aspx, но страничка реально существовала по пути, типа — c:\inetpub\wwwroot\VirtualFolder\folder\a2.aspx.

_SZ>>HttpModule c Server.Transfer на BeginRequest тоже работает так, как надо...
S>А куда делается Server.Transfer? Есть подозрение, что он просто пользуется VirtualPathProvider, который уже и так реализован шарепоинтом. Каким-то способом ведь виртуальные странички работают, так? Я просто с шарепоинтом никогда не работал.

Не разбирал ещё механизм сёрфинга виртуальных страничек, но походу он нормально трансферит на виртуальную страничку.

_SZ>>Если есть идеи более человеческого метода — всегда рад учиться :)
S>Ну, скорее всего человеческий метод именно в Server.Transfer. Хотя его, наверное, можно было сделать и в хэндлере.

Оки. Спасибо.
...
Рейтинг: 0 / 0
GetCompiledPageInstance() on SharePoint site
    #34558512
Sinclair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, _SZ_, Вы писали:

_SZ>Он срабатывал для a2.aspx, но страничка реально существовала по пути, типа — c:\inetpub\wwwroot\VirtualFolder\folder\a2.aspx.
А теперь странички там нет. Но обращение к http://server/folder/ а2.aspx по-прежнему работает?... << RSDN@Home 1.2.0 alpha rev. 677>>
...
Рейтинг: 0 / 0
GetCompiledPageInstance() on SharePoint site
    #34559111
_SZ_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, _SZ_, Вы писали:

_SZ>>Он срабатывал для a2.aspx, но страничка реально существовала по пути, типа — c:\inetpub\wwwroot\VirtualFolder\folder\a2.aspx.
S>А теперь странички там нет. Но обращение к http://server/folder/ а2.aspx по-прежнему работает?


Да. Шарпоинт возвращает контент страницы.
...
Рейтинг: 0 / 0
GetCompiledPageInstance() on SharePoint site
    #34559209
Sinclair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, _SZ_, Вы писали:
_SZ>Да. Шарпоинт возвращает контент страницы.
что значит контент? Исходник что ли?... << RSDN@Home 1.2.0 alpha rev. 677>>
...
Рейтинг: 0 / 0
GetCompiledPageInstance() on SharePoint site
    #34559308
_SZ_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, _SZ_, Вы писали:
_SZ>>Да. Шарпоинт возвращает контент страницы.
S>что значит контент? Исходник что ли?

Нет. Шарпоинт вернёт из базы объект типа SPFile (в объектной модели шарпоинта). По сути он и есть aspx файл.

С контентом тут всё достаточно условно, т.к. aspx страницы являются контентом для master.pages, web parts контентом для страничек, user controls контентом для web parts.
...
Рейтинг: 0 / 0
GetCompiledPageInstance() on SharePoint site
    #34559773
Sinclair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, _SZ_, Вы писали:

_SZ>Нет. Шарпоинт вернёт из базы объект типа SPFile (в объектной модели шарпоинта).
Интернет експлорер ничего не знает про SPFile. Он умеет делать HTTP запросы и отображать некоторые типы файлов. Что ты увидишь, если в браузере наберешь " http://server/folder/ а2.aspx"?
_SZ> По сути он и есть aspx файл.
aspx как файл весьма существенно отличается от результата его работы.... << RSDN@Home 1.2.0 alpha rev. 677>>
...
Рейтинг: 0 / 0
GetCompiledPageInstance() on SharePoint site
    #34562094
_SZ_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, _SZ_, Вы писали:

_SZ>>Нет. Шарпоинт вернёт из базы объект типа SPFile (в объектной модели шарпоинта).
S>Интернет експлорер ничего не знает про SPFile. Он умеет делать HTTP запросы и отображать некоторые типы файлов. Что ты увидишь, если в браузере наберешь " http://server/folder/ а2.aspx"?

В общем случае, то же самое, если бы это была невиртуальная страница и я бы набрал в браузере этот же адрес.
Думаю шарпоинт даёт иису aspx файл, а тот уже знает, как с ним работать. Структура файла точно такая же, как у обычной aspx странички.

_SZ>> По сути он и есть aspx файл.
S>aspx как файл весьма существенно отличается от результата его работы.

Ну.. результат его работы в базе лежать не должен... ;)
...
Рейтинг: 0 / 0
GetCompiledPageInstance() on SharePoint site
    #34562228
Sinclair
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, _SZ_, Вы писали:

_SZ>Здравствуйте, Sinclair, Вы писали:

S>>Здравствуйте, _SZ_, Вы писали:

_SZ>>>Нет. Шарпоинт вернёт из базы объект типа SPFile (в объектной модели шарпоинта).
S>>Интернет експлорер ничего не знает про SPFile. Он умеет делать HTTP запросы и отображать некоторые типы файлов. Что ты увидишь, если в браузере наберешь " http://server/folder/ а2.aspx"?

_SZ>В общем случае, то же самое, если бы это была невиртуальная страница и я бы набрал в браузере этот же адрес.
_SZ>Думаю шарпоинт даёт иису aspx файл, а тот уже знает, как с ним работать.
Гм. Твои представления о механизме работы ASP.NET не вполне полны:
1. IIS представления не имеет о том, как работать с нестатическими файлами
2. Всё, что у него есть — это карта ISAPI Extensions, которая объясняет, как обрабатывать определенные расширения в URL . Не указанные в карте расширения проверяются по карте MIME типов и в случае удачи обрабатываются внутри самого IIS.
3. Обычыно ASP.NET регистрируется в IIS для обработки запросов с .aspx, .ashx, .ascx и еще парой десятков расширений.
4. По умолчанию, запросы .aspx обрабатываются так:
-- делается попытка загрузить файл с указанным именем, он компилируется в соответствии с настройками приложения и исполняется. Эта фаза может быть сокращена в случае, если в кэше есть уже скомпилированный экземпляр обработчика. Всё это собственно и делается методом GetCompiledPageInstance().
-- надо отметить, что за загрузку файла отвечает VirtualPathProvider. По умолчанию, мспользуется примитивная реализация MapPathBasedVirtualPathProvider, которая просто отображает виртуальные пути в физические через стандартное HostingEnvironment.MapPath.
-- кроме того, стоит отметить, что за компиляцию найденного файла отвечает BuildProvider.
5. Поскольку для шарепоинта стандартный способ не может подходить, я полагаю, что шарепоинт регистрирует для соответствующего веб приложения virtualPathProvider, умеюший поднимать исходники .aspx из базы шарепоинта. Что должно быть отражено в соответствующем web.config (доступ к .config виртуализировать таким способом невозможно)
6. Альтернативой является регистрация шарепоинтом своего ISAPI Extension на все расширения для его фолдеров. В таком случае магия может быть и другой, т.к. ASP.NET runtime будет хоститься внутри нестандартного ISAPI, и у него могут быть другие пути получения compiledpageinstance.

_SZ>Структура файла точно такая же, как у обычной aspx странички.
:)... << RSDN@Home 1.2.0 alpha rev. 677>>
...
Рейтинг: 0 / 0
GetCompiledPageInstance() on SharePoint site
    #34562636
_SZ_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Sinclair, Вы писали:

Второе и третье я знал, за остальное огромное спасибо...

В общем то, что я сделал представлю ниже. Возможно не совсем по-человечески, но работает так, как надо... :)


private static void Application_BeginRequest(object sender, EventArgs e)
{
    HttpApplication application = (sender as HttpApplication);
    if (application != null)
    {
        HttpContext context = application.Context;

        if (context.Request.HttpMethod == "GET")
        {
            string virtualName;
            eSwitcherType switcherType;

            if (UrlUtils.TryGetVirtualName(context.Request.Path, out virtualName, out switcherType))
            {
                string queryString = string.Format("id={0}", virtualName);

                foreach (string key in context.Request.QueryString.Keys)
                {
                    if (key != "id")
                    {
                        queryString += string.Format("&{0}={1}", key, context.Request.QueryString[key]);
                    }
                }

                string url = string.Format("{0}{1}{2}", switcherType, "Details", ".aspx");
                context.RewritePath(url, string.Empty, queryString);
            }
        }
    }
}
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / SharePoint [игнор отключен] [закрыт для гостей] / GetCompiledPageInstance() on SharePoint site
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]