首页 > 解决方案 > 如何实现具有继承的控制器级版本控制?

问题描述

我有以下控制器结构 - 1.ValuesController:控制器 2.ValuesV2Controller:ValuesController 3.ValuesV3Controller:ValuesV2Controller 4.ValuesV4Controller:ValuesV3Controller

所有控制器都有一个通用方法 Get(Type value); 得到一个特定的记录。每个控制器的值类型都不同。

我已经使用 Microsoft.AspNetCore.Mvc.Versioning Nugget 在 ASP.NET Core Web API 中实现了版本控制。

在启动>配置服务;包含在下面的代码集 -

services.AddApiVersioning(o =>
        {
            o.ApiVersionReader = new HeaderApiVersionReader("x-lz-api- 
version");
            o.DefaultApiVersion = new ApiVersion(1, 0);
            o.ReportApiVersions = true;
            o.AssumeDefaultVersionWhenUnspecified = true;
         });

当我们调用 V1、V2、V3 API 时,它会给出 500 not found 错误,特别是针对使用自定义 Header 执行的版本控制。

尝试了以下可能的解决方案: 1. 将基类设为虚拟并覆盖它们的派生类,但由于类型不同,它不起作用。2. URL 版本控制不会出现此问题,这是非常特定于自定义标头版本控制的。

标签: c#asp.net-coreasp.net-web-api2versioning

解决方案


我认为您不需要多个控制器和继承来实现您想要做的事情。您可以简单地拥有一个具有不同操作方法的控制器。然后[ApiVersion]为每个操作定义属性。

[Route("api/values")]
public class ValuesController : ControllerBase
{
    [ApiVersion("1.0")
    public IActionResult GetV1()
    {
    }

    [ApiVersion("2.0")]
    public IActionResult GetV2()
    {
    }

    // and so on ..
}

如果您的控制器支持多个版本,您可以将操作映射到特定版本。

[ApiVersion("1.0")
[ApiVersion("2.0")]
[Route("api/values")]
public class ValuesController : ControllerBase
{
    [MapToApiVersion("1.0")]
    public IActionResult GetV1()
    {
    }

    [MapToApiVersion("2.0")]
    public IActionResult GetV2()
    {
    }

    // and so on ..
}

如果你必须有多个控制器,你可以[ApiVersion]为每个控制器定义。或者您可以在启动文件中设置约定

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

    o.Conventions.Controller<ValuesController>().HasApiVersion(new ApiVersion(1, 0));
    o.Conventions.Controller<ValuesV1Controller>().HasApiVersion(new ApiVersion(2, 0));
});

您还可以使用该o.Conventions.Controller<ValuesController>().Actions方法为特定操作添加约定。

我希望这有帮助。


推荐阅读