1

我在尝试为我的 MVC 项目建立非常规文件夹结构时遇到了一个奇怪的问题:

\Franchises\Compliance\FeesPaid\FeesPaidController
\Franchises\Compliance\FeesPaid\Views\..
\Franchises\Compliance\FeesPaid\ViewModels\..

我的计划是在每个子文件夹中有 1 个控制器,以及关联的视图/视图模型文件夹。我不希望有一个只包含一个类的 /Controllers/ 文件夹。

出于测试目的,我手动路由是这样的:

routes.MapRoute("whocares", "Franchises/Compliance/{controller}/{action}/{id}",
            new { controller = "FeesPaid", 
                  action = "Index", 
                  id = UrlParameter.Optional });

我遇到了神秘的行为。这些 URL 正确路由:

http://localhost:12345/Franchises/Compliance/FeesPaid/Index
http://localhost:12345/Franchises/Compliance/FeesPaid/Index/123

但是此 URL 失败并出现“Web 服务器配置为不列出此目录的内容”错误:

http://localhost:12345/Franchises/Compliance/FeesPaid

我发现只有当控制器名称与文件夹名称匹配时才会发生这种情况(减去“*Controller”)。因此,将控制器名称更改为其他名称可以使其工作:

\Franchises\Compliance\FeesPaid\FeesPaidXController

http://localhost:12345/Franchises/Compliance/FeesPaidX
http://localhost:12345/Franchises/Compliance/FeesPaidX/Index
http://localhost:12345/Franchises/Compliance/FeesPaidX/Index/123

当 URL 依赖于默认操作和 ID 时,为什么具有匹配名称的控制器和文件夹会导致它失败?

编辑

经过调查,事实证明 IIS 将请求路由到 DirectoryListingModule 而不是 MVC,因此它甚至没有到达 MVC 路由。

我尝试了以下方法无济于事:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true"  >  <--- attribute added
    <remove name="FormsAuthenticationModule"/>
  </modules>
</system.webServer>

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true"  >
    <remove name="FormsAuthenticationModule"/>
    <remove name="DirectoryListingModule"/>    <--- Fails to start web app with "lock violation"
  </modules>
</system.webServer>

如何强制 IIS 将这些请求路由到 MVC 而不是 DirectoryListingModule?最好没有 IIS 配置更改,我可能无法控制生产。

4

1 回答 1

0

感谢大家的评论。

进一步的调查使我在这里发布另一个问题:

如何在 MVC 模块下禁用或重新设置 IIS DirectoryListingModule 的优先级?

于 2014-02-18T00:45:31.447 回答