Старые классические ASP-страницы попадают в MVC Route - PullRequest
1 голос
/ 18 декабря 2011

Я конвертирую существующий классический веб-сайт ASP в (VB) MVC и не хочу, чтобы какой-либо из существующих URL-адресов ломался. Я прочитал много постов (вроде этого: Маршрутизация классических запросов ASP в .NET - SEO Redirects ) о том, как сделать правильное перенаправление 301. С последней версией MVC я понял, что

Response.RedirectPermanent(objRedirect.new_url, True)

- это все, что нужно.

Я ввел все свои старые URL в таблицу базы данных с соответствующим столбцом нового URL. Я добавил код на свою страницу 404, чтобы получить исходный URL:

Dim strURL As String = Request.RawUrl.Substring(Request.RawUrl.IndexOf("aspxerrorpath=") + 15).ToLower()

так что я могу посмотреть в базе данных. (Интересный sidenote, документация MSDN здесь - Режим перенаправления - кажется, говорит, что если я установлю RedirectMode = ResponseRewrite в разделе CustomErrors моего web.config, мне не придется беспокоиться о выполнении вышеизложенного, но когда я пробую это, я получаю ошибки IIS, говорящие, что это не будет обслуживать страницу ASP?!?!?)

Проблема, с которой я сталкиваюсь, заключается в том, что любой из моих старых, классических URL-адресов ASP, которые имеют тот же каталог, что и новый маршрут MVC, каким-то образом частично маршрутизируется. Например, «/test/default.asp» отображается как «/ test / test» в приведенной выше переменной strURL моей страницы ошибок.

У меня есть настройка маршрута для «теста»:

routes.MapRoute("Test", _
                "test/{action}", _
                New With {.controller = "test", .action = "index"})

в Global.aspx.vb, но я также пытался всеми возможными способами игнорировать все страницы ASP в маршрутах (по-видимому, безрезультатно). Вот попытки, которые я предпринял (я видел одну старую статью 2008 года Phil Haack , в которой говорилось, что я могу использовать только один из этих маршрутов "перехватить все", но не знаю, так ли это все еще действует или нет?):

routes.IgnoreRoute("{file}.asp")
routes.Ignore("{resource}.asp/{*pathInfo}")
routes.IgnoreRoute("{resource}.asp/{*pathInfo}")
routes.Add(New Route("{resource}.asp/{*pathInfo}", New StopRoutingHandler()))

и ни один из них, казалось, не имел никакого значения (очевидно, я попробовал их все по одному)

Он также не изолирован только для одного маршрута - он существует для любых каталогов, существующих на старом сайте, которые соответствуют именованному маршруту на новом сайте.

Заранее благодарим вас за любые ваши предложения!

ОБНОВЛЕНИЕ: Вот еще 2 "проблемы", которые я обнаружил:

  1. Я теряю оригинальную строку запроса. Таким образом, если запрашивается product.asp? Id = 1, все, что у меня есть на странице ошибок, это product.asp (есть идеи, как получить / сохранить исходную строку запроса?)
  2. Еще один из моих маршрутов выглядит так:

    route.MapRoute ("IndependentSales", _ "Independentsales / {действие}", _ Новое с {.controller = "independentsales", .action = "index"})

и когда я запрашиваю "/resale/default.asp", он переходит к "перепродаже / независимым продажам". Что случилось с этим ???

Ответы [ 2 ]

0 голосов
/ 21 декабря 2011

ОК, после нескольких часов чтения / исследования / отладки я пришел к выводу, что я не делал ничего плохого и что в Visual Studio, .NET, MVC было что-то "глючное" ... что-то!И я был прав!Я создал новый проект с нуля, скопировал весь свой код туда и все работало как надо!

(Ну, я не уверен, что «как должно» правильно, но я получил свой кодфункционировать так, как я хотел. Запросы для ASP-страниц все еще попадают в MvcApplication_BeginRequest - что, я не думаю, что они должны с моими записями IgnoreRoute ???? - но по крайней мере расширение все еще было там, когда оно туда попало, так что я могперейдите на страницу ASP в моей базе данных и выполните перенаправление!)

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

... Быть программистом - отстой!; -D

(Musings ... 3 вещи, которые я не добавил обратно в свой новый проект:

  1. инструмент ведения журнала ELMAH
  2. RouteMagic DLL
  3. и RouteDebugger.dll.

Я могу попытаться вычесть их из моего первоначального проекта и посмотреть, как это происходит. Учитывая популярность ELMAH и кто написалМаршрутные, я не могу себе представить, что с ними будут проблемы, но кто знает ...?)

0 голосов
/ 18 декабря 2011

Вы пытались использовать web.config?

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Remove index.php" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
                    <match url="^(.*)$" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

Приведенный выше пример используется для перезаписи приложения CodeIgniter, чтобы исключить файл index.php из URL.С этим можно многое сделать, учитывая условия условий.В этом случае переписывание выполняется только в том случае, если это не файл и не каталог.

...