代码之家  ›  专栏  ›  技术社区  ›  Derviş Kayımbaşıoğlu

ASP.NET Core 2.2升级-默认路由重定向问题

  •  0
  • Derviş Kayımbaşıoğlu  · 技术社区  · 6 年前

    在ASP.NET核心2.1之前,我使用下面的代码将默认路由重定向到Swagger端点。

    app.UseMvc(builder =>
    {
        builder.MapRoute("default", template: "api/{controller}/{action}/{id?}");
        builder.MapGet("", context =>
        {
            context.Response.Redirect("./swagger/index.html", permanent: false);
            return Task.FromResult(0);
        });
    
    });
    

    但是,当我升级到ASP.NET Core 2.2时,此代码没有按预期工作(调用重定向)

    这是已知问题吗?我怎么解决?

    编辑:感谢@kirklarkin

    我变了 options.EnableEndpointRouting false 现在它开始工作了。然而,正如我所理解的,这是传统的路由方法。

    我需要做什么才能进行路由选择 options.EnableEndpointRouting = true; ?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Kirk Larkin    6 年前

    考虑到您在此处应用的重定向与ASP.NET核心MVC不直接相关,一个选项是 Use Routing Middleware 而不是在MVC中添加路由。下面是一个例子:

    app.UseRouter(builder =>
    {
        builder.MapGet("", context =>
        {
            context.Response.Redirect("./swagger/index.html", permanent: false);
            return Task.FromResult(0);
        });
    });
    

    参数传递到 UseRouter 委托人(代表) builder )是的实例 RouteBuilder ,它与传递到 UseMvc 代表。在上面的示例中,我们直接应用所需的路由。

    此呼叫可以在现有呼叫之前或之后添加到 USEMVC 但添加它 之前 可能更符合逻辑(和 也许吧 稍微高一点的性能)可以在不涉及MVC的情况下做出重定向的决定。

    值得注意的是,这种方法根本不使用端点路由。在ASP.NET Core 2.2中,端点路由 only applies to ASP.NET Core MVC :

    随着ASP.NET核心2.2中端点路由的发布,端点链接仅限于MVC/Razor页面操作和页面。端点链接功能的扩展是为将来的版本而计划的。

    也许在不久的将来,这种路由中间件方法也会改变,但目前为止,我提供的方法工作得很好,并且得到了充分的支持。

    作为使用路由中间件的替代方法,也可以使用一个简单的自定义中间件功能来执行重定向。以下是一个完整性示例:

    app.Use(async (context, next) =>
    {
        if (context.Request.Path == "/")
        {
            context.Response.Redirect("./swagger/index.html", permanent: false);
            return;
        }
    
        await next();
    });
    

    实现这一点还有更多的选择,但我不会在这里一一列举。

    推荐文章