如何在.NET 7 MVC应用程序中注册自定义IRouter?

问题描述 投票:0回答:1

我有一个自定义的

IRouter
实现,但我不知道如何在 .NET 7 MVC 应用程序中注册它。

我想要完成的是:传入请求的形式为

https://example.com/{id}
,当收到这样的请求时,我需要访问数据库以检索该控制器和操作
{id}
,对其进行一些检查,然后如果一切正常,则将请求连同整个
RequestContext
一起传递到默认路由器。其背后的原因是这样的 URL 仅对给定时间和访问用户的子集有效。此外,底层操作和控制器一定不能通过查看 url 来猜测。

我想出了一个自定义的

IRouter
实现(它也允许我创建这些 URL),但我似乎不知道如何在应用程序启动时注册。

在 .NET 7 中使用自定义

IRouter
仍然是正确的方法吗?我如何注册一个?还是我完全走错了路?

c# asp.net-mvc asp.net-core asp.net-mvc-routing .net-7.0
1个回答
1
投票

一种选择是从端点路由切换回来:

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);
    }
}

请注意,由于您仍在使用默认路由管道,这看起来像是通过模糊来实现安全性,这通常不是一个好方法,可能您应该更好地实施适当的安全限制(您不应该依赖“不可能”来猜测实际路由).

© www.soinside.com 2019 - 2024. All rights reserved.