Ошибки ASP.NET MVC eurl.axd - PullRequest
       8

Ошибки ASP.NET MVC eurl.axd

30 голосов
/ 21 июня 2010

Используя следующие шаги:

(я проверил этот аналогичный пост , который не решает мою проблему.)

  1. В Windows Server 2003 / IIS6 я создаю новый сайт под названием «testapp»
  2. В VS2010 я создаю новое приложение ASP.NET MVC 2.
  3. Я добавляю представление под названием «Информация» со следующим кодом:

    <h2>System</h2>
    
    <h3>Request</h3>
    
    <%
        foreach (string key in Request.Headers)
        {
            Response.Write(string.Format("<p>{0}={1}</p>"
                    , key
                    , Request.Headers[key])
                    );
        }
    
    
    %>
    

В дополнение к стандартным заголовкам я вижу это:

   X-REWRITE-URL=/home/info/eurl.axd/e3299f29f8043d4f8a27e0f1d0c40971

Я использую Helicon ISAPI Rewrite 3 , который генерирует заголовок "X-REWRITE-URL".

Моя проблема в следующем: откуда взялся /eurl.axd?....? Я видел эту статью , но, поскольку это пустое приложение в новой папке с новым пулом приложений, в этой веб-папке запущены приложения NO 2.0. *. Нет виртуальных папок, указывающих на другой каталог и т. Д. Сайт настроен для ASP.NET 4.0, который зарегистрирован правильно.

Проблема заключается в том, что eurl.axd искажает параметры в моих маршрутах MVC.

Параметры в статье «ASP.NET 4.0 Breaking Changes» на самом деле не работают для меня, потому что в этом приложении нет компонентов 2.0, и мне нужно использовать URL без расширений.

Обновление Я только что заметил, что System.Web.MVC в GAC - это версия 2.0.0.0. Должно ли это быть обновлено до 4.0 с установкой VS2010 и платформы 4.0?

Я не понимаю, почему я вижу эту ошибку с приложением ASP.NET MVC 2 по умолчанию. Помогите !!

Обновление 2/2011 - Решено

Наконец, попытавшись отключить URL без расширений через взлом реестра, проблема исчезла. Мне кажется нелогичным, что отключение URL-адресов без расширений делает работу URL-адресов без расширений (с сопоставлением с подстановочными знаками в IIS6), но я возьму то, что смогу получить.

Обновление 12/2014

(Веселый | Счастливый | Мирный) (Рождество | Ханука | Кванзаа | Декабрь).

Я забыл упомянуть, что любое другое обновление Windows приводило к изменению реестра. Это выглядело как странные проблемы, когда запрос к http://site.dom/bob не удался, а http://site.dom/bob/ был бы успешным Повеселись! (Обратите внимание на косую черту.)

Ответы [ 3 ]

43 голосов
/ 25 июля 2010

Это часть подхода Microsoft, согласно которому ASP.NET v4 по умолчанию разрешает обрабатывать URL-адреса без расширений в IIS 6. Он описан здесь в документе ASPNET V4 Breaking Changes .(Поиск в этом документе для eurl.axd).Это происходит только с ASPNET v4.

Что происходит:

  1. aspnet_filter.dll, глобальный фильтр ISAPI, который реализует ASPNET (щелкните правой кнопкой мыши папку Веб-сайты> Свойства длявидеть это) проверяет каждый входящий URL.Для тех URL, которые не имеют расширения, ASPNET изменяет URL-адрес, чтобы вставить в него /eurl.axd/some-long-number.На самом деле длинный номер - это подсказка без черточек.

  2. Ваш перезаписывающий URL-адрес, фильтр ISAPI для конкретного сайта, запускается следующим и видит искаженный URL-адрес.Поскольку ваши правила не ожидают URL-адреса с введенной в них нечетной последовательностью, ваш фильтр перезаписи не обрабатывает их должным образом, и пользователь, вероятно, в итоге получит 404.

Это будетпроисходит с любым фильтром перезаписи - Helicon ISAPI_Rewrite, IIRF и т. д. - при установке с IIS6 и ASPNET v4.Это также может произойти с другими фильтрами ISAPI - теми, которые явно не переписываются.

То, что Microsoft намеревалось произойти:

  1. aspnet_filter.dll ISAPI filter добавляет /eurl.axd/some-long-number к URL-адресу без расширения.(Если в URL-адресе есть расширение, он оставляет его в покое, сохраняя при этом снижение производительности от попадания в управляемый код.) Это просто для добавления туда «.axd», чтобы IIS6 в конфигурации по умолчанию сопоставлялся с aspnet_isapi.dllISAPI расширение (приложение).

  2. Приложение aspnet_isapi.dll ISAPI принимает запрос, восстанавливает URL-адрес, удаляя /eurl.axd/some-long-numberи передает его в код ASP.NET, предназначенный для обработки расширенных URL-адресов.Этот код обрабатывает запрос и не осознает, что когда-либо случался /eurl.axd/some-long-number shenanigans.

Microsoft не смогла рассмотреть, что произойдет с фильтрами ISAPI для проверки URL-адресовкоторые находятся между шагами 1 и 2. В примечаниях к выпуску ASP.NET 4 есть примечание о приложениях .NET 2.0, вызывающих эту ошибку;это только один из способов.

У вас есть несколько вариантов:

  • Используйте ключ реестра, чтобы просто отключить его.HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0> DWORD EnableExtensionlessUrls до 0, затем перезапустите IIS.

  • Перезапись URL в конвейере ASP.NET.(Очевидно, что в этом случае вы можете переписывать только управляемые запросы.)

  • Установите средство перезаписи URL-адресов фильтра ISAPI на глобальном уровне с приоритетом выше aspnet_filter.dll.Звучит как боль для меня.

  • Настройте веб-сайт для использования ASPNET v2, а не ASPNET v4.

  • вставьте правило в свой редактор, чтобы полностью игнорировать URL с eurl.axd в них.Это может быть так просто, как
    RewriteRule eurl\.axd -

Я использую ключ реестра, и он отлично работает для меня.

Удачи!

ОБНОВЛЕНИЕ 2011-08-10: Похоже, что обновления Windows, которые обслуживают .NET Framework, сбрасывают раздел реестра, и его необходимо повторно применить.

Редактировать 2012-02-17 У нас была эта проблема, и наша команда потратила несколько часов на ее решение, прежде чем кто-то обнаружил это в комментариях, чтобы завершить решение для нас. "Обратите внимание, что для Wow64 (т. Е. 32-разрядного рабочего процесса, работающего в 64-разрядной ОС) этот раздел реестра должен иметь значение HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ ASP.NET \ 4.0.30319.0 \ EnableExte‌ nsionlessUrls. "

17 голосов
/ 10 февраля 2011

Я использую следующее регулярное выражение в качестве первого правила с Ionics Isapi Rewriter для веб-сайтов, работающих на ASP.NET 4 на IIS 6 для устранения проблем, вызванных критическим изменением , введенным в ASP.NET 4:

RewriteRule ^(.*)/eurl.axd/[a-f0-9]{32}(.*)$ $1$2

Это позволит мне снова использовать URL без расширений.

Обратите внимание, что второеgroup захватывает строку запроса, если она есть, и восстанавливает ее в переписанном URL.

И да, это функция, а не ошибка .

1 голос
/ 12 августа 2011

Я столкнулся с подобной проблемой и нашел решение через нашего поставщика модулей ISAPI Rewrite.Я задокументировал результаты и решение: http://www.vanadiumtech.com/OurBlog/post/2011/08/12/Cause-of-eurlaxd.aspx

...