我有一个自定义的
IRouter
实现,但我不知道如何在 .NET 7 MVC 应用程序中注册它。
我想要完成的是:传入请求的形式为
https://example.com/{id}
,当收到这样的请求时,我需要访问数据库以检索该控制器和操作{id}
,对其进行一些检查,然后如果一切正常,则将请求连同整个 RequestContext
一起传递到默认路由器。其背后的原因是这样的 URL 仅对给定时间和访问用户的子集有效。此外,底层操作和控制器一定不能通过查看 url 来猜测。
我想出了一个自定义的
IRouter
实现(它也允许我创建这些 URL),但我似乎不知道如何在应用程序启动时注册。
在 .NET 7 中使用自定义
IRouter
仍然是正确的方法吗?我如何注册一个?还是我完全走错了路?
一种选择是从端点路由切换回来:
builder.Services.AddMvc(options => options.EnableEndpointRouting = false);
app.UseMvc(routeBuilder => routeBuilder.Routes.Add(new CustomRouter(routeBuilder.DefaultHandler)));
UPD
替代方法是使用
MapDynamicControllerRoute
。类似这样的事情:
builder.Services.AddScoped<MyDynamic>();
// ...
app.MapDynamicControllerRoute<MyDynamic>("/{*internalid}");
public class MyDynamic : DynamicRouteValueTransformer
{
public override ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
{
if (values.TryGetValue("internalid", out var value) && value is string s && s == "777") // simulate some search for id
{
values["controller"] = "Home";
values["action"] = "test";
}
return new ValueTask<RouteValueDictionary>(values);
}
}
请注意,由于您仍在使用默认路由管道,这看起来像是通过模糊来实现安全性,这通常不是一个好方法,可能您应该更好地实施适当的安全限制(您不应该依赖“不可能”来猜测实际路由).