ASP.NET MVC 4 "wants" 我的自定义路由的尾部斜杠

ASP.NET MVC4 "wants" a tailing slash for my custom route

我的 ASP.NET MVC 应用程序中有以下路由:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
       name: "AppCode",
       url: "AppCode",
       defaults: new { controller = "AppToken", action = "AuthenticateUser", authCode = UrlParameter.Optional }
   );

    routes.MapRoute(
        name: "ReplayFileRoute",
        url: "Replays/{replayName}/{fileName}",
        defaults: new { controller = "Replay", action = "GetReplayFile" }
    );

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

现在的问题是下面的URL会导致404,并且"GetReplayFile"-Action不会被执行:

http://localhost:59174/Replays/kgm3eauw.zbg/raha5qit.ikp.pls

但是,以下 URL 有效:

http://localhost:59174/Replays/kgm3eauw.zbg/raha5qit.ikp.pls/

所以当我添加尾部斜杠时,ASP 选择正确的路线,否则它不会。此时添加尾部斜杠不是一个选项,因为 URLs 将由外部脚本生成。我只通过

http://localhost:59174/Replays/kgm3eauw.zbg/

对于脚本,实际的文件名将由脚本生成 - 没有尾部斜杠。

所以我的问题是:如何让第一个URL调用"right"方法?

另外:是否有关于 RouteConfig 确切工作原理的文档?到目前为止我还没有找到太多。

我想问题在于,它希望您的 URL 指向一个文件并绕过 ASP.NET MVC 路由引擎。您必须让 所有 请求通过 ASP.NET 才能让它匹配看起来也像文件的 URL。

您可以在 web.config 文件中进行设置。添加:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>