C# 当控制器名称与文件夹名称匹配时,MVC无法匹配默认操作?

C# 当控制器名称与文件夹名称匹配时,MVC无法匹配默认操作?,c#,asp.net-mvc-routing,asp.net-mvc-5,asp.net-mvc-controller,C#,Asp.net Mvc Routing,Asp.net Mvc 5,Asp.net Mvc Controller,我在尝试为我的MVC项目建立一个非传统的文件夹结构时遇到了一个奇怪的问题: \Franchises\Compliance\FeesPaid\FeesPaidController \Franchises\Compliance\FeesPaid\Views\.. \Franchises\Compliance\FeesPaid\ViewModels\.. 我的计划是在每个子文件夹中有一个控制器,以及相关的视图/视图模型文件夹。我不希望有一个只包含一个类的/Controllers/文件夹 出于测试目的

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

\Franchises\Compliance\FeesPaid\FeesPaidController
\Franchises\Compliance\FeesPaid\Views\..
\Franchises\Compliance\FeesPaid\ViewModels\..
我的计划是在每个子文件夹中有一个控制器,以及相关的视图/视图模型文件夹。我不希望有一个只包含一个类的/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配置更改,我可能无法控制生产。

谢谢大家的评论

进一步调查后,我在这里提出了另一个问题:


请注意,包含控制器的目录与MapRoutes没有任何关系。例如,您的控制器可能都位于项目的根目录中,只要请求Url与MapRoute匹配,控制器就会执行http://localhost:12345/Franchises/Compliance/FeesPaid/ 请注意额外的结束斜杠。结束处的额外斜杠没有任何区别。不知何故,MVC丢失了路由,请求将转到某个通用目录列表模块。它可能只是一个ASP.Net功能,在您的web.config中,如果启用“设置为true:”会怎么样?我敢打赌它是有效的。这似乎与此有关,我正在进一步调查: