【问题标题】:ASP.Net Core 2.2 Upgrade - Default Route Redirection IssueASP.Net Core 2.2 升级 - 默认路由重定向问题
【发布时间】:2019-06-11 18:37:18
【问题描述】:

在 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; 进行路由?

【问题讨论】:

  • 我希望这会改变 MVC 切换到端点路由。您不需要尝试通过 MVC 处理此路由 - 您可以在对 UseSwaggerUI(...) 的调用中清除 RoutePrefix。即app.UseSwaggerUI(o => o.RoutePrefix = string.Empty);.
  • 很久没有使用UseSwaggerUI,因为 SwaggerUI 更新不频繁。此外,我的 swagger.js 中有自定义实现。因此,我需要自定义路由:)

标签: c# asp.net-core routing asp.net-core-2.1 asp.net-core-2.2


【解决方案1】:

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

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

    endpoints.MapControllers();
});

【讨论】:

  • 我实际上不得不使用这个:endpoints.MapGet("/index.html", context => ...
【解决方案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();
});

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

【讨论】:

    猜你喜欢
    • 2019-05-12
    • 2012-04-12
    • 1970-01-01
    • 2021-02-22
    • 2019-07-21
    • 2020-05-31
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多