Сопоставить заданное имя файла и расширение независимо от каталога, используя маршрутизацию MVC - PullRequest
1 голос
/ 24 марта 2012

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

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

Возможные запросы могут быть в форме

/myfile.xml

/somedirectory/myfile.xml

/any/number/of/directories/myfile.xml

Мне нужно сопоставить их все и направить к одному действию контроллера.

Я пытался использовать wilcards в URL-адресе маршрута, например.

routes.MapRoute(
    "MyFileRoute",
    "{*path}/myfile.xml",
    new { controller = "MyFileController", action = "GetMyFile" }
);

но я получаю следующую ошибку

A catch-all parameter can only appear as the last segment of the route URL.
Parameter name: routeUrl

У меня нет контроля над самим запросом, поскольку он поступает от стороннего флэш-плагина и, похоже, ищет файл, в котором, по его мнению, находится html-файл, поскольку я использую MVC, это не физическое расположение.

Ответы [ 3 ]

1 голос
/ 25 марта 2012

ОК, так что я думаю, что когда у вас есть только молоток ...

Потратив слишком много времени, пытаясь заставить работать маршрутизацию или обработчик, я в итоге посмотрел на это по-другому ииспользуя IIS7 Url Rewrite для перезаписи запросов на myfile.xml в любом пути к фактическому физическому местоположению реального файла.

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

Я добавил это правило в файл конфигурации, который, кажется, работает хорошо.

<rewrite>
  <rules>
    <clear />
    <rule name="Redirect myfile" patternSyntax="Wildcard" stopProcessing="true">
      <match url="*/myfile.xml" />
      <action type="Rewrite" url="/actual/path/myfile.xml" />
    </rule>
  </rules>
</rewrite>
1 голос
/ 24 марта 2012

Вы действительно должны использовать маршрутизацию?Как насчет старого доброго HttpHandler ?

<configuration>
   <system.web>
      <httpHandlers>
         <add verb="GET" 
              path="*/myfile.xml" 
              type="MyFileHandler"/>
     </httpHandlers>
   <system.web>
</configuration>
0 голосов
/ 01 апреля 2012

Поймать все параметры в любом месте URL

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

Код и подробное описание можно найти в моем блоге .

...