Ответ 1
Это часть подхода Microsoft, позволяющего без перенаправления URL-адресов ASP.NET v4 по умолчанию в IIS 6. Он описан здесь в ASPNET V4 Ломающиеся изменения. (Искать в этом документе для eurl.axd). Это происходит только с ASPNET v4.
Что происходит:
-
aspnet_filter.dll
, глобальный фильтр ISAPI, который реализует ASPNET (щелкните правой кнопкой мыши папку "Веб-узлы" > "Свойства", чтобы увидеть его) проверяет каждый входящий URL-адрес. Для тех URL-адресов, которые не имеют расширения, ASPNET управляет URL-адресом для вставки/eurl.axd/some-long-number
в него. На самом деле длинное число - это указатель без дефиса. -
Ваш URL-ретранслятор, фильтр ISAPI для конкретного сайта, запускается дальше и видит искаженный URL-адрес. Поскольку ваши правила не ожидают URL-адресов с этой нечетной последовательностью, введенной в них, ваш фильтр перезаписи не обрабатывает его должным образом, и пользователь, вероятно, закончит с 404.
Это произойдет с любым фильтром перезаписи - Helicon ISAPI_Rewrite, IIRF и т.д. - при установке с IIS6 и ASPNET v4. Это может также произойти с другими фильтрами ISAPI - теми, которые явно не перезаписываются.
Что планировалось Microsoft:
-
aspnet_filter.dll
Фильтр ISAPI добавляет /eurl.axd/some-long-number к URL без продолжения. (Если URL-адрес имеет расширение в нем, он оставляет его в покое, что позволяет сэкономить производительность при ударе управляемого кода.) Это просто для того, чтобы получить ".axd", поэтому IIS6 в своей конфигурации по умолчанию будет отображаться вaspnet_isapi.dll
Расширение ISAPI (приложение). -
Приложение
aspnet_isapi.dll
ISAPI подбирает запрос, разрывает URL-адрес, удаляя/eurl.axd/some-long-number
и передает его в код ASP.NET, предназначенный для обработки URL-адресов без расширения. Этот код обрабатывает запрос и не понимает, что произошли события /eurl.axd/some-long-number shenanigans.
Microsoft не рассмотрела, что произойдет для проверки URL-адресов фильтров ISAPI, которые находятся между шагами 1 и 2. В примечаниях к выпуску ASP.NET 4 есть заметка о приложениях .NET 2.0, вызывающих эту ошибку; что только один способ это может произойти.
У вас есть несколько вариантов:
-
Используйте ключ реестра, чтобы отключить его.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0
> DWORDEnableExtensionlessUrls
до0
, затем перезапустите IIS. -
Переписывать URL в конвейере ASP.NET. (Очевидно, вы можете переписать управляемые запросы только в этом случае.)
-
Установите URL-адрес переписывающего URL-адреса фильтра ISAPI на глобальном уровне с приоритетом выше
aspnet_filter.dll
. Мне кажется болью. -
Настройте веб-сайт для использования ASPNET v2, а не ASPNET v4.
-
Вставьте правило в свой перезаписывающее устройство, чтобы полностью игнорировать URL-адреса с помощью eurl.axd. Это может быть так же просто, как и
RewriteRule eurl\.axd -
Я использую раздел реестра, и он отлично работает для меня.
Удачи!
UPDATE 2011-08-10: Похоже, что Windows Updates, обслуживающий .NET Framework reset раздел реестра, и его необходимо повторно использовать.
Редактировать 2012-02-17 У нас была эта проблема, и наша команда провела несколько часов работы над проблемой, прежде чем кто-то нашел, что это похоронено в комментариях, завершило решение для нас. "Обратите внимание, что для Wow64 (т.е. 32-разрядного рабочего процесса, работающего на 64-разрядной ОС) этот раздел реестра должен быть установлен в HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\4.0.30319.0\EnableExte nsionlessUrls."