Использование Application_BeginRequest для перезаписи URL

До сих пор мы переписывали URL-адреса, используя страницу custon 404: URL-адрес не сопоставлялся ни с одним файлом на сайте, и мы настроили IIS для отправки ошибки 404 на страницу aspx, которая перенаправляла эти URL-адреса на правильный URL-адрес. < br> Теперь мы хотим прекратить использовать перенаправления, поэтому после прочтения статьи Скотта Гатри о переопределении URL-адресов я хочу использовать Application_BeginRequest в Global.asax. Дело в том, что многие наши URL-адреса не перезаписываются и могут попасть в нужное место без какого-либо вмешательства. Меня беспокоит, что теперь каждый запрос должен будет проходить через метод Application_BeginRequest (даже непереписанный URL-адрес), и я боюсь, что это замедлит их загрузку.
Как вы думаете? Является ли время загрузки проблемой при использовании Application_BeginRequest?


person Lea Cohen    schedule 01.12.2008    source источник


Ответы (5)


В любом случае каждый запрос проходит через Application_BeginRequest.

Вам нужно будет добавить некоторую логику, чтобы изменять только те страницы, которые нужно переписать.

Эта небольшая часть логики будет не очень дорогой.

Я использовал его и вообще не заметил снижения производительности.

person Joe Ratzer    schedule 01.12.2008

Есть очень надежные решения, если вы собираетесь использовать его чаще и которые имитируют модуль Apache mod_rewrite, мне нравится этот, потому что я его использовал, и это не дало мне никаких проблем:

http://www.codeplex.com/IIRF

or:

http://urlrewriter.net/

http://www.managedfusion.com/products/url-rewriter/

Вы можете прочитать больше вариантов в этом посте:

перезапись URL-адресов ASP.NET

Как говорит Джош, основная статья: http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

person netadictos    schedule 01.12.2008
comment
Не могли бы вы объяснить, почему эти методы лучше, чем метод, который я предложил? - person Lea Cohen; 01.12.2008
comment
У вас есть ISAPI, где вы можете централизовать множество вещей с множеством опций, например, для доменов, а также для URL-адресов. Посмотрите эти сообщения: codinghorror.com/blog/archives/000797.html или hanselman.com/blog/ - person netadictos; 02.12.2008

Просто замечание для других, у кого могут быть проблемы. Убедитесь, что у вас есть

<modules runAllManagedModulesForAllRequests="true">

в вашем web.config

person adinas    schedule 11.02.2010

Эта статья немного устарела ... и теперь в .NET framework есть более подходящие подходы. Что забавно, я делал именно то, что делаете вы (захват обработчика ошибок).

http://www.singingeels.com/Blogs/Nullable/2007/09/14/URL_ReWriting_The_Right_Way_Its_Easy.aspx

Я думаю, вы хотите этим заниматься сейчас. Да, и насчет производительности ... это добавляет около 0,00001 секунды к времени вашей страницы.

person Timothy Khouri    schedule 01.12.2008
comment
Хорошо, тогда продолжайте работу с Гатри ... удар по производительности все еще невероятно незначителен. - person Timothy Khouri; 01.12.2008

Скотта Гатри article - хорошая статья, но мне любопытно, почему вы решили сделать это через Global.asax, а не использовать HttpModule, как он предлагает. Кроме того, жизненный цикл страницы Asp.Net в любом случае проходит через каждое из этих событий в Global.asax.

События HttpModule запускают каждый запрос, и пока вы не делаете ничего сумасшедшего в своей логике, все должно быть в порядке. Даже поиск в базе данных в методе Application_BeginRequest можно уменьшить за счет правильного кэширования.

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

person Josh    schedule 01.12.2008
comment
Логика перезаписи довольно сложна, и, судя по тому, что я мог понять о HttpModule, сделать это таким образом не выглядело проще. Кроме того, global.asax уже находится в проекте, и мне не нужно добавлять dll. - person Lea Cohen; 01.12.2008