【问题标题】:Controller route not found if it contains a version如果控制器路由包含版本,则找不到控制器路由
【发布时间】:2022-02-04 05:22:52
【问题描述】:

当通过外部项目包含控制器时,我在尝试路由到控制器时遇到问题。仅当从路由中删除版本字段时,直接包含在项目中或从外部项目中包含问题的控制器才能正常工作。控制器定义如下。

[ApiController]
[ApiVersion("1.0")]
[Produces("application/json")]
[Route("api/v{version:apiVersion}/devices")]
[Authorize(Roles = UserConst.PermissionGroup.Admin)]
public class DeviceManagementController : ControllerBase{...}

将路线更改为下面的工作正常

[Route("api/devices")]

将路由更改为下面的失败与通过{version:apiVersion}包含它的方式相同

[Route("api/v1.0/devices")]

有什么想法可能是错的吗?对于任何版本信息,服务器似乎只是返回默认索引页面,这是找不到控制器时的后备。

用于添加 Api 版本控制的 Startup.cs 代码

services.AddApiVersioning(config =>
{
    config.DefaultApiVersion =
      new ApiVersion(1, 0);
   config.AssumeDefaultVersionWhenUnspecified = true;
   config.ReportApiVersions = true;
});

【问题讨论】:

  • stackoverflow.com/questions/54021924/… 也许一样?如,我认为“。”是问题
  • 我不确定,因为它适用于其他控制器并且只有在移动到外部组件时才会失败?
  • 你用的是什么网址?
  • @JohnH 我可以确认它是应用程序部分。 .net core 5.0 会自动执行此操作,如果不包含版本,路由会很好地解析
  • @Serge /api/v1.0/devices 是过去运行良好的 URL,但自从移到外部后就不行了。

标签: c# .net asp.net-core .net-core asp.net-mvc-controller


【解决方案1】:

我做了一些测试。

首先我将 [Route("api/devices")] 添加到您的控制器属性中

[ApiController]
    [ApiVersion("1.0")]
    [Produces("application/json")]
    [Route("api/v{version:apiVersion}/devices")]
    [Route("api/devices")]
    public class DeviceManagementController : ControllerBase 

发现 url .../api/v1.0/devices 工作正常。

在此之后,我尝试仅使用 .../api/devices url。

  1. 它与 [ApiVersion("1.0")] 属性一起正常工作

  2. 当我将属性更改为 [ApiVersion("2.0")] 时,它发出了错误的版本错误

所以一切都按预期进行。

总结:

我建议您添加 [Route("api/devices")] 并尝试使用.../api/devices url 作为解决方法,直到您找到更好的方法。

【讨论】:

  • 感谢谢尔盖的帮助。它至少为我指明了正确的方向,结果证明缓存导致旧页面被加载!删除缓存让我可以让 api/version 路由正常工作。
  • 不客气!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 2016-07-12
相关资源
最近更新 更多