【问题标题】:ASP.NET Core 3.0 catch-all route unexpected behaviorASP.NET Core 3.0 包罗万象的路由意外行为
【发布时间】:2020-02-23 10:50:22
【问题描述】:

最近遇到了一些意想不到的问题

我使用的是 ASP.NET Core 3.0,我在 StartUp.cs 中定义了两条路由

StartUp.cs

   app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "file",
            pattern: "{controller=File}/folder/{*path}",
            new { Action = "Folder" });

        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=File}/{action=Index}/{filename}");
    });

文件控制器.cs

public class FileController : Controller
{
    public IActionResult Folder(string path)
    {
        return Ok(path);
    }

    public IActionResult Index(string filename)
    {
        return Ok(filename);
    }
}

请求 file/folder/abc/abc 我希望匹配第一条路线 但结果是 404 not found

但是如果我改变了路线的顺序

   app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=File}/{action=Index}/{filename}");

        endpoints.MapControllerRoute(
            name: "file",
            pattern: "{controller=File}/folder/{*path}",
            new { Action = "Folder" });
    });

成功了!

如果我在顶部定义 {controller=File}/folder/{*path},我的问题是为什么第一个版本不起作用

我以为它会顺序检查路由表

【问题讨论】:

  • 如果您使用第一个UseEndpoints 方法,然后请求/File/folder/abc/abc 而不是/file/folder/abc/abc,会发生什么情况?尽管表面上不区分大小写,但路由可能表现出区分大小写的行为。
  • 与第一个版本相同的结果

标签: asp.net-core


【解决方案1】:

一般来说,我们总是将客户路由器放在默认路由之前。对于这个问题,如果我们在默认路由之前放置非包罗万象的路由,它将按预期工作。但是,如果我们将包罗万象的路由放在默认路由之前,您会发现当我们通过文件/文件夹/abc/abc 访问时您找不到任何页面。这个问题在 asp.net core 3.0 中不存在,但在 asp.net core 2.0 和 MVC 项目中也存在。如果您需要使用包罗万象的路线,最好将它们放在后面的路线表中。您还可以阅读这篇文章了解更多详情:Multiple routes。这将有助于解决未知问题。

【讨论】:

    猜你喜欢
    • 2016-08-20
    • 2011-04-02
    • 2011-10-13
    • 2021-08-17
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多