c# - 如何实现具有继承的控制器级版本控制?
问题描述
我有以下控制器结构 - 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 版本控制不会出现此问题,这是非常特定于自定义标头版本控制的。
解决方案
我认为您不需要多个控制器和继承来实现您想要做的事情。您可以简单地拥有一个具有不同操作方法的控制器。然后[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
方法为特定操作添加约定。
我希望这有帮助。
推荐阅读
- javascript - 如何为电子中的文件制作自定义网址
- mysql - 如何在节点js中获取带有图像的ckeditor4的内容
- javascript - 获取没有兄弟元素的集合分支,按属性搜索
- javascript - 如何在 webpack 中的 bundle 之间摇树依赖关系?
- sockets - 读取内容或获取 ssl_write() 写入的缓冲区大小
- crystal-reports - Crystal Reports ODBC 在 CMC 中不起作用
- tailwind-css - Tailwind - 链接在悬停时没有默认光标指针
- wordpress - 编辑优雅杂志主题的页脚
- liferay-7 - DDM 表单 portlet 声纳问题
- android - 在 gradle 依赖中使用修改后的 Exoplayer