如何在 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}
路线)。
我正在使用 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}
路线)。