asp.net-mvc – 如何在MVC模块下禁用或重新设置IIS DirectoryListingModule的优先级?

我使用MVC文件夹结构,其中URL路由恰好匹配目录名称,例如:

<proj>\My\Cool\Thing\ThingController.cs

需要通过此网址访问:

http://blahblah/My/Cool/Thing

我有MVC路由工作,但不幸的是,当依赖默认{action}& {id},IIS Express将请求路由到DirectoryListingModule,因为它直接匹配文件夹名称.目录列表当然是禁用的,所以我得到:

The Web server is configured to not list the contents of this directory.
Module     DirectoryListingModule
Notification       ExecuteRequestHandler
Handler    StaticFile

为了解决这个问题,我已经尝试过:

1. runAllManagedModulesForAllRequests = true

<system.webServer>
<modules runAllManagedModulesForAllRequests="true" >   
//Makes no difference

2. Removing module

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" >
    <remove name="DirectoryListingModule"/>   
    // Won't let me as module is locked in IIS
  </modules>
</system.webServer>

3. Removing lock & module

// applicationhost.config
<add name="DirectoryListingModule" lockItem="false" />

// web.config
<remove name="DirectoryListingModule"/>
// Causes startup error"Handler "StaticFile" has a bad module "DirectoryListingModule" in its module list"


4. Removing lock & removing/readding module (to change order) - makes no difference

// web.config
<remove name="DirectoryListingModule"/>
<add name="DirectoryListingModule"/>

撕掉我的头发.如何让IIS将其路由到我的MVC应用程序而不是DirectoryListingModue?最好是web.config中的解决方案,因此我们不需要在生产中重新配置IIS.

(一种解决方法是保留我的文件夹结构,但将其全部存储在/ Areas / …之下,只是为了打破文件夹路径和url之间的匹配.这是一个可怕的黑客和最后的手段.)

编辑以添加路线映射

我正在创建相对于每个控制器的命名空间的自定义路由(命名空间始终匹配文件夹).请注意,所有内容都放在“模块”命名空间/文件夹下,目前只是为了避免上述问题.

    private static void RegisterAllControllers(RouteCollection routes)
    {
        const string controllerSuffix = "Controller";
        const string namespacePrefix = "My.Cool.Websire.UI.Modules.";

        var controllerTypes = Assembly.GetExecutingAssembly().GetTypes().Where(x => x.IsSubclassOf(typeof(Controller))).ToList();

        foreach (var controllerType in controllerTypes)
        {
            // Turn My.Cool.Website.UI.Modules.X.Y.Z.Abc.AbcController into a route for url /X/Y/Z/Abc/{action}/{id}
            var fullNamespace = controllerType.Namespace ?? "";

            var relativeNamespace = fullNamespace.Substring(namespacePrefix.Length, fullNamespace.Length - namespacePrefix.Length);

            var controllerName =
                controllerType.Name.EndsWith(controllerSuffix)
                ? controllerType.Name.Substring(0, controllerType.Name.Length - controllerSuffix.Length)
                : controllerType.Name;

            var url = relativeNamespace.Replace(".", "/") + "/{action}/{id}";

            var routeName = "Dedicated " + controllerName + " route";

            routes.MapRoute(routeName, url, new { controller = controllerName, action = "Index", id = UrlParameter.Optional });
        }
    }

最佳答案 我在这个阶段的解决方案是将WebUI项目的MVC内容放在/ Modules /文件夹下:

My.Cool.Site.WebUI/Modules/Something/Blah/BlahController
My.Cool.Site.WebUI/Modules/Something/Blah/Views/...
My.Cool.Site.WebUI/Modules/Something/Blah/PartialViews/...

然后使用发布的路线代码,我可以通过网址访问:

http://.../Something/Blah/[action]

因为这些文件位于/ Modules /文件夹下,所以这会破坏URL和文件夹路径之间的匹配,从而解决我的问题.

这不是一个很好的解决方案,但能胜任.

点赞