MVC路由捕获文件名作为参数

时间:2012-09-17 16:01:42

标签: asp.net-mvc

我正在尝试使用MVC生成一个简单的WebDAV服务器,我终于到了需要向用户提供所请求文件的阶段。

我有一个路由设置来处理遍历目录结构"webdav/{*path}",它工作正常,直到该路径以文件名结尾。此时,IIS似乎确定它是静态文件,并尝试从磁盘提供该文件。由于它不在URL中指定的位置,因此返回404错误。

我没有任何自由更改网址,我基本上需要它在表单中,否则Windows资源管理器无法使用它作为映射驱动器:

GET /webdav/Test/Test2.txt

我已将路由设置为贪婪匹配,因为目录结构可以包含多个级别。我还设置了routes.RouteExistingFiles = true;

这是在我的开发机器上使用IIS Express 8.0。

我已经设置了一个空白的MVC项目来测试它,这就是RegisterRoutes方法:

routes.RouteExistingFiles = true;

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    name: "WebDAVGet",
    url: "webdav/{*path}",
    defaults: new { controller = "WebDAV", action = "Get", path = "" });

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", 
    id = UrlParameter.Optional }
);

所以,转到/webdav/Test/Test2命中控制器中的断点,但转到/webdav/Test/Test2.txt会给我一个404。

有什么建议吗?

2 个答案:

答案 0 :(得分:12)

我需要添加

<modules runAllManagedModulesForAllRequests="true">

到网络配置。

啊,我已经在这几天苦苦挣扎了,我知道在这里张贴会改变堵塞!

答案 1 :(得分:2)

另一种选择是将其添加到&lt; system.webserver&gt; web.config中的节点:

<modules>
  <remove name="UrlRoutingModule-4.0" />
  <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>

我可以保证这适用于IIS 7.5。

为了记录,我找到了这个解决方案here