如何在 asp.net 核心中使用回退路由?

How to use fallback routing in asp.net core?

我正在使用 asp.net web-api 和控制器。 我想做一个用户部分,在那里可以像示例一样在用户名后面请求网站地址。com/username。其他已注册的路由,如 about、support 等应该有更高的优先级,所以如果你输入 example.com/about,about 页面应该首先出现,如果不存在这样的 about 页面,它会检查是否有用户这样的名字存在。我只找到了 SPA 回退路由的方法,但我不使用 SPA。在中间件中手动使用它,但是更改它非常复杂。

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

string[] internalRoutes = new string[] { "", "about", "support", "support/new-request", "login", "register" };

string[] userNames = new string[] { "username1", "username2", "username3" };

app.Use(async (context, next) =>
{
    string path = context.Request.Path.ToString();
    path = path.Remove(0, 1);

    path = path.EndsWith("/") ? path[0..^1] : path;

    foreach (string route in internalRoutes)
    {
        if (route == path)
        {
            await context.Response.WriteAsync($"Requested internal page '{path}'.");
            return;
        }
    }

    foreach (string userName in userNames)
    {
        if (userName == path)
        {
            await context.Response.WriteAsync($"Requested user profile '{path}'.");
            return;
        }
    }

    await context.Response.WriteAsync($"Requested unknown page '{path}'.");
    return;

    await next(context);
});

app.Run();

使用控制器和 attribute routing 真的很简单。 首先,使用 app.MapControllers();(在 app.Run() 之前)添加控制器支持。

然后,使用适当的路由声明您的控制器。为简单起见,我添加了一个 returns 简单字符串。

public class MyController : ControllerBase
{
    [HttpGet("/about")]
    public IActionResult About()
    {
        return Ok("About");
    }

    [HttpGet("/support")]
    public IActionResult Support()
    {
        return Ok("Support");
    }

    [HttpGet("/support/new-request")]
    public IActionResult SupportNewRequest()
    {
        return Ok("New request support");
    }

    [HttpGet("/{username}")]
    public IActionResult About([FromRoute] string username)
    {
        return Ok($"Hello, {username}");
    }
}

路由 table 将首先检查是否存在完全匹配(例如 /about/support),如果没有,if 将尝试找到具有匹配参数的路由(例如 /Métoule 将匹配 /{username} 路线)。