无论使用MVC路由的目录如何,都匹配给定的文件名和扩展名

时间:2012-03-24 19:09:33

标签: asp.net-mvc-3 asp.net-mvc-routing

这听起来应该很简单,但我似乎无法让它发挥作用。

我需要添加一个匹配给定文件名和扩展名的路由,而不管子目录(包括网站的根目录)

可能的请求可以是

形式
/myfile.xml

/somedirectory/myfile.xml

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

我需要将它们全部匹配并路由到相同的控制器动作。

我尝试在路线网址中使用wilcards,例如

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

我无法控制请求本身,因为它来自第三方Flash插件,并且似乎在寻找它认为html文件所在的文件,因为我使用的是MVC,这不是物理位置。

3 个答案:

答案 0 :(得分:1)

你真的必须使用路由吗?好老的 HttpHandler 怎么样?

<configuration>
   <system.web>
      <httpHandlers>
         <add verb="GET" 
              path="*/myfile.xml" 
              type="MyFileHandler"/>
     </httpHandlers>
   <system.web>
</configuration>

答案 1 :(得分:1)

好的,所以我猜你所拥有的只是一把锤子......

在花费太多时间尝试使路由或处理程序工作之后,我最终以不同的方式查看此内容并使用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>

答案 2 :(得分:0)

在URL

中的任何位置捕获所有参数

我写过这样的路线,支持这种全能参数。实际上只要其他段可以定义就可以有很多,所以我们仍然可以区分哪个部分进入哪个段。

可以找到代码和详细说明on my blog