Подтвердить что ты не робот

Предотвратить загрузку обработчика статического файла с помощью перехвата имени файла

В моем веб-приложении у меня есть маршрут, который выглядит так:

routeCollection.MapRoute(
    "AdfsMetadata",                                                // name
    "FederationMetadata/2007-06/FederationMetadata.xml",           // url
    new { controller = "AdfsController", action = "MetaData" });   // defaults

Идея этого маршрута заключалась в том, чтобы лучше работать с сервером Microsoft AD FS (2.0+), который ищет метаданные AD FS в этот момент, когда вы просто указываете имя хоста. С MVC3 все работало нормально. Но мы недавно обновили проект до MVC4, и теперь вызов этого URL-адреса приводит к 404, обработчик, упомянутый на странице ошибки, StaticFile, а физический путь - D:\path\to\my\project\FederationMetadata\2007-06\FederationMetadata.xml. Я предполагаю, что MVC или ASP.NET "думает", это должен быть запрос на статический файл и ищет файл, но это не файл. Данные генерируются динамически - поэтому я направил URL-адрес на действие контроллера. Проблема в том, что даже отладчик Route от Phil Haack не работает. Это всего лишь 404 без дополнительной информации, кроме того, что IIS попытался получить доступ к физическому файлу, которого там нет.

У кого-нибудь есть решение для этого? Я просто хочу, чтобы этот URL-адрес был перенаправлен на действие контроллера.

PS: Я не уверен на 100%, что причиной было обновление до MVC4, это было просто предположение, потому что ошибка произошла примерно в то же самое время, что и обновление, и тот же маршрут работает в другом проекте, который все еще используя MVC3.

Edit:

У меня есть пользовательский ControllerFactory, которому требуется полное имя класса (AdfsController вместо Adfs), поэтому суффикс Controller в этом случае правильный.

4b9b3361

Ответ 1

Добавьте в раздел <handlers> <system.webServer> node:

следующее:
<add 
    name="AdfsMetadata" 
    path="/FederationMetadata/2007-06/FederationMetadata.xml" 
    verb="GET" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" />

Это указывает IIS, что GET-запросы к указанному URL-адресу должны обрабатываться управляемым конвейером и не считаться статическими файлами и обслуживаться IIS напрямую.

У меня есть пользовательский ControllerFactory, которому требуется полное имя класса (AdfsController вместо Adfs), поэтому контроллер суффиксов верен в этом случае.

Дважды проверьте это. Попробуйте с суффиксом Controller в определении маршрута и без него.

Ответ 2

IIS по умолчанию обслуживает этот файл как статический, выходящий в конвейер ASP, вы можете изменить маршрут, чтобы не было расширения .xml(что необязательно, по крайней мере, у вас есть определенное требование об этом)

Вы можете указать маршрут следующим образом:

routeCollection.MapRoute(
"AdfsMetadata",                                                // name
"FederationMetadata/2007-06/FederationMetadata",               // url
new { controller = "AdfsController", action = "MetaData" });   // defaults

Другое решение - добавить в ваш web.config

<modules runAllManagedModulesForAllRequests="true">

но я рекомендую вам избегать этого, насколько это возможно, так как он запрещает IIS обслуживать все статические файлы

РЕДАКТИРОВАТЬ Последняя попытка... пользовательский обработчик HTTP для этого конкретного пути будет работать. Это сообщение похоже на вашу проблему только с изображениями (посмотрите раздел "Лучше: Пользовательские HttpHandlers" )