在之前的 asp.net web api
中,我实现了 DefaultHttpControllerSelector
来指定我希望请求如何定位我的 Controller 。我经常有不同名称但用于相同进程的不同 Controller 。唯一的区别是一个版本比另一个版本高。
例如,我可以有一个名为 BookingV1Controller
的 Controller ,用于处理服务的第一个版本。我还会有 BookingV2Controller
,它旨在处理服务的第二个版本。然后,客户端应用程序将使用此 url http://myservice.com/api/v2/booking/someaction?id=12
向服务发出请求。为了处理请求,我将提供 DefaultHttpControllerSelector
的自定义实现,以根据请求的版本选择所需的适当 Controller 版本。
但是,我似乎没有办法在 ASP.NET Core
中执行此操作。我到处搜索都无济于事。也没有可以提供帮助的文档。
如果有人能帮到我,我将不胜感激。谢谢。
更新
我还想知道如果在自定义 header 中指定了版本该怎么办。例如 X-Version:v1
更新 2
要求是服务的版本不应该暴露在 URL 中。如果不存在版本,则服务会返回有关如何添加版本的说明。如果请求的 Controller 不存在于请求的版本中,系统将搜索较低的版本。如果它在任何较低版本中找到它,它就会使用它。这样做的原因是为了防止在所有版本上重复使用 Controller 。但是对于 ASP.NET Core,这可能是不可能的。
最佳答案
这是我偶然发现的一个非常古老的问题,但现在有更好的解决方案。有这个包
Microsoft.AspNetCore.Mvc.Versioning
它具有更丰富的功能来实现版本控制。其中包括能够使用 URL 查询字符串、url 路径、 header 或自定义版本阅读器。能够从 HTTPContext 等读取版本。
简而言之,您将以下内容添加到 startup.cs 中的 ConfigureServices 方法中
services.AddApiVersioning(o => {
o.ReportApiVersions = true;
o.AssumeDefaultVersionWhenUnspecified = true;
o.DefaultApiVersion = new ApiVersion(1, 0);
});
然后你必须用 ApiVersion 装饰你的 Controller 。
[ApiVersion("1.0")]
[Route("api/home")]
public class HomeV1Controller : Controller
{
[HttpGet]
public string Get() => "Version 1";
}
[ApiVersion("2.0")]
[Route("api/home")]
public class HomeV2Controller : Controller
{
[HttpGet]
public string Get() => "Version 2";
}
也可以在路径中实现,放在路由中
[ApiVersion("1.0")]
[Route("api/{version:apiVersion}/home")]
public class HomeV1Controller : Controller
{
[HttpGet]
public string Get() => "Version 1";
}
[ApiVersion("2.0")]
[Route("api/{version:apiVersion}/home")]
public class HomeV2Controller : Controller
{
[HttpGet]
public string Get() => "Version 2";
}
当你使用这种通过 Microsoft 包实际实现它的方法时,这也意味着你可以弃用版本、进行版本发现、轻松地从 HttpContext 访问版本号等。这些你都做不到如果它只是硬编码在您的 route ,请执行此操作。
更多信息(包括在标题中使用它):
关于c# - 如何在 ASP.NET Core Web Api 中完成版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38304961/