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

时间:2019-01-17 14:24:47

标签: c# asp.net-core routing 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);
    });

});

但是,当我升级到Asp.Net Core 2.2时,此代码无法按预期方式工作(称为重定向)

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

编辑:感谢@KirkLarkin

我已将options.EnableEndpointRouting更改为false,现在可以使用了。但是,据我了解,这是传统的路由方法。

要使用options.EnableEndpointRouting = true;进行路由,我需要做什么?

2 个答案:

答案 0 :(得分:2)

鉴于您在此处应用的重定向与ASP.NET Core 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 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();
});

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

答案 1 :(得分:0)

值得注意的是,在 ASP.NET Core 3.1 中,以下工作:

app.UseEndpoints(endpoints =>
{
    endpoints.MapGet("/", context =>
    {
        context.Response.Redirect("swagger/index.html", permanent: false);
        return Task.CompletedTask;
    });

    endpoints.MapControllers();
});