.net core 在ASP.Net Core 3中使用IRouteConstraint捕获所有路由

.net core 在ASP.Net Core 3中使用IRouteConstraint捕获所有路由,.net-core,routing,constraints,asp.net-core-3.0,.net Core,Routing,Constraints,Asp.net Core 3.0,我使用的是.Net Core MVC 3.0,默认为端点路由 默认路由配置为: app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Link}/{action=Index}/{id?}" }); 这将允许我

我使用的是.Net Core MVC 3.0,默认为
端点路由

默认路由配置为:

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Link}/{action=Index}/{id?}"
        });
这将允许我在“链接”上执行CRUD操作
e、 g./链接/编辑/123

我需要能够捕获并将任何非CRUD操作的请求路由到另一个控制器和操作
e、 g./布拉布拉赫
这样我就可以随心所欲地处理它们(可能是重定向,可能只是一个友好的通知,可能是任何东西!)

回到我的.Net Framework MVC中,可以添加如下路由配置:

        routes.MapRoute(
            name: "MyCatchAll",
            url: "{key}",
            defaults: new { controller = "MyController", action = "MyAction" },
            constraints: new { key = new MyConstraint() }
        );
(约束的目的只是一个可选的检查,例如,我可能需要使用它来确保
blahblah
与预期值匹配)

但是,我无法在.Net核心MVC 3.0中实现这一点


任何指针都将不胜感激。

对于asp.net core 3.0,您可以使用以下配置:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "MyCatchAll",
        pattern: "{key}",
        defaults: new { controller = "MyController", action = "MyAction" },
        constraints: new { key = new MyConstraint() }
    );
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    endpoints.MapRazorPages();
});
MyConstraint.cs

public class MyConstraint: IRouteConstraint
{
    public bool Match(HttpContext httpContext,
                        IRouter router,
                        string parameterName,
                        RouteValueDictionary values,
                        RouteDirection routeDirection)
    {
        var url = values["key"];
        //your logic to check
        return true;
    }
}

从理论上讲,您如何区分任何积垢路径和非积垢路径?你能提供一个例子吗?@MuhammadHannan:post中我的.net framework示例代码是我在.net framework中实现相同功能的方法,但是.net core 3默认使用端点路由(这是我试图更好地理解的)配置不同。我在第一次尝试时尝试了这一点,但当我收到404请求(如
/blahblah
)时,我的约束代码断点甚至没有被击中,这意味着路径
MyCatchAll
由于某种原因没有匹配。我相信这与路线特定性优先级有关(路线图越具体,其优先级就越高——显然,不管在任何给定情况下它可能有多么不准确或不匹配,哈哈!)