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

Der*_*ğlu 6 c# routing asp.net-core asp.net-core-2.1 asp.net-core-2.2

在 Asp.Net Core 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);
    });

});
Run Code Online (Sandbox Code Playgroud)

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

这是已知问题吗?我该如何解决?

编辑:感谢@KirkLarkin

我已更改options.EnableEndpointRoutingfalse现在它正在工作。但是,据我了解,这是传统的路由方法。

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

Kir*_*kin 10

鉴于您在此处应用的重定向与 ASP.NET Core MVC 没有直接关系,一种选择是使用路由中间件,而不是在 MVC 本身内添加路由。下面是一个例子:

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

传递给UseRouter委托 ( builder)的参数是 的实例RouteBuilder,它与传递给UseMvc委托的类型相同。在上面的例子中,我们只是直接应用所需的路由。

这个调用可以在现有的 调用之前或之后UseMvc添加,但在之前添加它可能更合乎逻辑(并且性能可能稍微提高一些),因为可以在不涉及 MVC 的情况下做出重定向的决定。

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

随着 ASP.NET Core 2.2 中端点路由的发布,端点链接仅限于 MVC/Razor Pages 操作和页面。端点链接功能的扩展计划在未来版本中进行。

也许在不久的将来,这种路由中间件方法也会发生变化,但就目前而言,我提供的方法运行良好并且得到了全面支持。

作为使用路由中间件的替代方法,还可以使用简单的自定义中间件函数来执行重定向。为了完整性,这里有一个例子:

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

    await next();
});
Run Code Online (Sandbox Code Playgroud)

实现这一目标还有更多选择,但我不会在此一一列举。