ASP.Net Core 2.2 升级 - 默认路由重定向问题
ASP.Net Core 2.2 Upgrade - Default Route Redirection Issue
在 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;
进行路由?
鉴于您在此处应用的重定向与 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:
With the release of endpoint routing in ASP.NET Core 2.2, endpoint linking is limited to MVC/Razor Pages actions and pages. The expansions of endpoint-linking capabilities is planned for future releases.
也许在不久的将来,这种路由中间件的方法也会改变,但目前我提供的方法效果很好,并且得到了完全支持。
作为使用路由中间件的替代方法,也可以使用简单的自定义中间件函数来进行重定向。为了完整起见,这里有一个示例:
app.Use(async (context, next) =>
{
if (context.Request.Path == "/")
{
context.Response.Redirect("./swagger/index.html", permanent: false);
return;
}
await next();
});
还有更多的选择可以实现这一点,但我不会在这里一一列举。
值得注意的是,在 ASP.NET Core 3.1 中,以下工作:
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", context =>
{
context.Response.Redirect("swagger/index.html", permanent: false);
return Task.CompletedTask;
});
endpoints.MapControllers();
});
在 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;
进行路由?
鉴于您在此处应用的重定向与 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:
With the release of endpoint routing in ASP.NET Core 2.2, endpoint linking is limited to MVC/Razor Pages actions and pages. The expansions of endpoint-linking capabilities is planned for future releases.
也许在不久的将来,这种路由中间件的方法也会改变,但目前我提供的方法效果很好,并且得到了完全支持。
作为使用路由中间件的替代方法,也可以使用简单的自定义中间件函数来进行重定向。为了完整起见,这里有一个示例:
app.Use(async (context, next) =>
{
if (context.Request.Path == "/")
{
context.Response.Redirect("./swagger/index.html", permanent: false);
return;
}
await next();
});
还有更多的选择可以实现这一点,但我不会在这里一一列举。
值得注意的是,在 ASP.NET Core 3.1 中,以下工作:
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", context =>
{
context.Response.Redirect("swagger/index.html", permanent: false);
return Task.CompletedTask;
});
endpoints.MapControllers();
});