|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
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 вэб интерфейс и лежат в базе. Есть идеи, как можно обойти это препятствие? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2007, 20:39 |
|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
Здравствуйте, _SZ_, Вы писали: _SZ>Но директория и страница были добавлены через SharePoint Designer и SharePoint вэб интерфейс и лежат в базе. _SZ>Есть идеи, как можно обойти это препятствие? Есть идея почитать вокруг virtual path provider. С ним, возможно, свой хэндлер и не понадобится.... << RSDN@Home 1.2.0 alpha rev. 677>> ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2007, 09:20 |
|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
Здравствуйте, 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... пока думаю... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2007, 17:50 |
|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
Здравствуйте, _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>> ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2007, 08:20 |
|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
Здравствуйте, 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 тоже работает так, как надо... Если есть идеи более человеческого метода — всегда рад учиться :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2007, 13:07 |
|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
Здравствуйте, _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>> ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2007, 13:23 |
|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
Здравствуйте, 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. Хотя его, наверное, можно было сделать и в хэндлере. Оки. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2007, 15:50 |
|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
Здравствуйте, _SZ_, Вы писали: _SZ>Он срабатывал для a2.aspx, но страничка реально существовала по пути, типа — c:\inetpub\wwwroot\VirtualFolder\folder\a2.aspx. А теперь странички там нет. Но обращение к http://server/folder/ а2.aspx по-прежнему работает?... << RSDN@Home 1.2.0 alpha rev. 677>> ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2007, 16:21 |
|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
Здравствуйте, Sinclair, Вы писали: S>Здравствуйте, _SZ_, Вы писали: _SZ>>Он срабатывал для a2.aspx, но страничка реально существовала по пути, типа — c:\inetpub\wwwroot\VirtualFolder\folder\a2.aspx. S>А теперь странички там нет. Но обращение к http://server/folder/ а2.aspx по-прежнему работает? Да. Шарпоинт возвращает контент страницы. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2007, 18:18 |
|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
Здравствуйте, _SZ_, Вы писали: _SZ>Да. Шарпоинт возвращает контент страницы. что значит контент? Исходник что ли?... << RSDN@Home 1.2.0 alpha rev. 677>> ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2007, 18:42 |
|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
Здравствуйте, Sinclair, Вы писали: S>Здравствуйте, _SZ_, Вы писали: _SZ>>Да. Шарпоинт возвращает контент страницы. S>что значит контент? Исходник что ли? Нет. Шарпоинт вернёт из базы объект типа SPFile (в объектной модели шарпоинта). По сути он и есть aspx файл. С контентом тут всё достаточно условно, т.к. aspx страницы являются контентом для master.pages, web parts контентом для страничек, user controls контентом для web parts. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2007, 19:25 |
|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
Здравствуйте, _SZ_, Вы писали: _SZ>Нет. Шарпоинт вернёт из базы объект типа SPFile (в объектной модели шарпоинта). Интернет експлорер ничего не знает про SPFile. Он умеет делать HTTP запросы и отображать некоторые типы файлов. Что ты увидишь, если в браузере наберешь " http://server/folder/ а2.aspx"? _SZ> По сути он и есть aspx файл. aspx как файл весьма существенно отличается от результата его работы.... << RSDN@Home 1.2.0 alpha rev. 677>> ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2007, 05:42 |
|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
Здравствуйте, Sinclair, Вы писали: S>Здравствуйте, _SZ_, Вы писали: _SZ>>Нет. Шарпоинт вернёт из базы объект типа SPFile (в объектной модели шарпоинта). S>Интернет експлорер ничего не знает про SPFile. Он умеет делать HTTP запросы и отображать некоторые типы файлов. Что ты увидишь, если в браузере наберешь " http://server/folder/ а2.aspx"? В общем случае, то же самое, если бы это была невиртуальная страница и я бы набрал в браузере этот же адрес. Думаю шарпоинт даёт иису aspx файл, а тот уже знает, как с ним работать. Структура файла точно такая же, как у обычной aspx странички. _SZ>> По сути он и есть aspx файл. S>aspx как файл весьма существенно отличается от результата его работы. Ну.. результат его работы в базе лежать не должен... ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2007, 17:12 |
|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
Здравствуйте, _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>> ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2007, 17:40 |
|
GetCompiledPageInstance() on SharePoint site
|
|||
---|---|---|---|
#18+
Здравствуйте, 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); } } } } ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2007, 20:27 |
|
|
start [/forum/topic.php?fid=12&msg=34549747&tid=1330602]: |
0ms |
get settings: |
28ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
81ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
287ms |
get tp. blocked users: |
1ms |
others: | 314ms |
total: | 747ms |
0 / 0 |