Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Обработка HTTP запроса


Автор: Tomcat 19.5.2005, 15:25
Пишем CMS.

Необходимо сделать так, чтобы доступ к контенту для пользователя происходил прозрачно. Допустим имеется некоторый документ с именем document. Предполагается, что пользователь обращается к нему с помощью URL:
http://someserver/somevirdir/document.aspx
В реале страницы document.aspx не существует: global.asax, поймав такой запрос, редиректит его на страницу, допустим, content.aspx, которая в свою очередь разбирает запрашиваемый ресурс, производит поиск его в базе данных, получает содержимое и возвращает обратно пользователю.

Вопрос в том, как сделать тоже самое для получения, например, картинки? В этом случае пользователь использует что-то типа:
http://someserver/somevirdir/picture.jpg
Картинка тоже хранитсся в базе, но злой IIS ищет этот ресурс физически, и возвращает пользователю 404-ю ошибку. До global.asax дело даже не доходит.
Вот как это можно реализовать средствами чисто ASP.NET? А если никак, то может что-нить можно сделать с IIS?
Короче, КАК??? smile

Автор: mr.DUDA 19.5.2005, 20:39
Сделай так. В global.asax.cs пропиши проверку запроса на предмет того, файл какого типа запрашивается. Если это твоя картинка, тогда используй текущую сессию (или параметры запроса, как там у тебя задумано) для получения картинки из базы данных, и возвращай стрим с картинкой.

404-я ошибка возвращается, если ресурс с данным именем не найден в указанном виртуальном каталоге (или алиасе). Значит, ты можешь например создать global.asax прямо в той директории, где находится default.aspx, и в этой странице прописать ссылку на картинку, расположенную в той же директории и имеющую имя, которое твой global.asax.cs распознает, как я написал ранее.

Автор: Tomcat 20.5.2005, 12:29
Цитата(mr @ 19.5.2005, 19:39)
Сделай так. В global.asax.cs пропиши проверку запроса на предмет того, файл какого типа запрашивается. Если это твоя картинка, тогда используй текущую сессию (или параметры запроса, как там у тебя задумано) для получения картинки из базы данных, и возвращай стрим с картинкой.

404-я ошибка возвращается, если ресурс с данным именем не найден в указанном виртуальном каталоге (или алиасе). Значит, ты можешь например создать global.asax прямо в той директории, где находится default.aspx, и в этой странице прописать ссылку на картинку, расположенную в той же директории и имеющую имя, которое твой global.asax.cs распознает, как я написал ранее.

Так все это понятно...
Просто дело в том, что если запрашиваемый ресурс является, например, картинкой (т.е. с каким-нибудь jpg-расширением) у global.asax.cs не вызываются обработчики вообще.

Автор: Tomcat 23.5.2005, 10:37
Мда, видимо не судьба.

Автор: arilou 23.5.2005, 13:37
Tomcat
До global.asax дело не доходит, потому что расширение файла .jpg не связано с ISAPI расширением aspnet_isapi.dll. Попробуй его добавить в Manage my computer->Internet Informarion Services->Default web site->Your virtual folder->Properties->Home directory->Configure.

Там все просто, думаю, у тебя получится. После этих манипуляций должен будет выполняться Global.asax.

Автор: Tomcat 24.5.2005, 09:55
Цитата(arilou @ 23.5.2005, 12:37)
Tomcat
До global.asax дело не доходит, потому что расширение файла .jpg не связано с ISAPI расширением aspnet_isapi.dll. Попробуй его добавить в Manage my computer->Internet Informarion Services->Default web site->Your virtual folder->Properties->Home directory->Configure.

Там все просто, думаю, у тебя получится. После этих манипуляций должен будет выполняться Global.asax.

Вариант, конечно.
Только в системе будут хранится файлы различного содержания. Одних толькокартинок с различными расширениями сколько. А еще есть pdf-ы, doc-и, zip-ы, rar-ы и т.п. Их всех придется прописать в насторойках для этой виртуальной директории, но все возможные расширения не предусмотришь.

Сейчас ковырялся в настройках виртуальной директории... А что если пойти на такую хитрость: в IIS настроить страницу переадресации в случае ошибки 404 на свою aspx-страницу, а не стандартную. Изврат, конечно... Но...

Вы что думаете?

Автор: arilou 24.5.2005, 11:31
Понимаешь, тот подход, что я предложил уже используется народом для решения типовой задачи (такой как у тебя). Есть еще один вариант: использовать ASPX-страницу для генерации image'а. Конечно, в дизайнере ты ничего не увидишь, но зато в рантайме все будет работать.

Если интересно, могу привести код на VB.NET

Автор: Tomcat 24.5.2005, 11:47
Цитата(arilou @ 24.5.2005, 10:31)
Понимаешь, тот подход, что я предложил уже используется народом для решения типовой задачи (такой как у тебя). Есть еще один вариант: использовать ASPX-страницу для генерации image'а. Конечно, в дизайнере ты ничего не увидишь, но зато в рантайме все будет работать.

Если интересно, могу привести код на VB.NET

Так вариант с генерацией картинки у меня и используется. Есть aspx-страница, которая берет из базы эти картинки, составляет корректный заголовок и отправляет ответ. Вопрос в том, как переадресовать запрос на эту aspx-страницую.

Автор: arilou 24.5.2005, 13:55
Цитата(Tomcat @ 24.5.2005, 11:47)
Вопрос в том, как переадресовать запрос на эту aspx-страницую

http://forum.vingrad.ru/index.php?showtopic=52642&view=findpost&p=419369

Вероятно, тебе еще потребуется свой HttpHandler в дополнение к вышесказанному, но это я пальцем в небо тыкаю.

Автор: Tomcat 24.5.2005, 14:19
Цитата(arilou @ 24.5.2005, 12:55)
http://forum.vingrad.ru/index.php?showtopic=52642&view=findpost&p=419369

Я же сказал, что в этом случае мне придется предусмотреть все (!) варианты расширений для запрашиваемых ресурсов и указать их в настройках виртуальной директории. Чего я в принципе не могу обеспечить. Мало ли, что конечному узверю захочется хранить в моей CMS в качестве бинарных данных.

Автор: arilou 24.5.2005, 14:28
Там можно поставить ".*" в качестве расширения. Попробуй - по идее, тогда все файлы должны идти через ASP.NET

Автор: Tomcat 24.5.2005, 14:57
Цитата(arilou @ 24.5.2005, 13:28)
Там можно поставить ".*" в качестве расширения. Попробуй - по идее, тогда все файлы должны идти через ASP.NET

Угу, только не ".*", а просто "*".
Вот и решение! smile

Бальшое пасиба!!! smile

Автор: arilou 24.5.2005, 15:08
Я рад, что в итоге смог помочь smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)