一、版本掌握的优点:
(1)有助于实时推出功用, 而不会损坏现有体系。
(2)它还能够协助为选定的客户供应分外的功用。
API 版本掌握能够采纳差别的体式格局举行掌握,要领以下:
(1)在 URL 中追加版本或作为查询字符串参数,
(2)经由过程自定义标头和经由过程接收标头
在这篇文章中, 让我们来看看怎样支撑多个版本的 ASP.NET Core Web API。
一、建立asp.net core webapi 项目,援用NuGet包:Install-Package Microsoft.AspNetCore.Mvc.Versioning -Version 2.0.0
项目和安装包都好了,接着我们须要在Startup.cs中的ConfigureServices 要领中增加下面的代码:
如您所见, 设置了3差别的选项。
ReportAPIVersions: 这是可选的。然则, 当设置为 true 时, API 将返回相应标头中支撑的版本信息。
AssumeDefaultVersionWhenUnspecified: 此选项将用于不供应版本的要求。默许状况下, 假定的 API 版本为1.0。
DefaultApiVersion: 此选项用于指定在要求中未指定版本时要运用的默许 API 版本。这将默许版本为1.0。
这是一切的设置和设置。如今, 我们将看到接见 API 版本的差别体式格局。
二、经由过程QueryString来完成版本掌握
翻开我们的掌握器,在上面增加ApiVersion特征,以下代码所示:
上面的代码作为1.0版本。您还能够在差别的定名空间中建立另一个具有雷同称号的掌握器类, 并将 API 版本设置为2.0版本。以下图所示:
就这样。如今转到浏览器并接见掌握器。您应当看到 API 版本1.0 掌握器的输出, 由于它被设置为默许值。如今在 URL 中追加 api-version=2, 您应当看到 api 版本2.0 掌握器的输出。
二、经由过程URL Path Segment来完成:
查询字符串参数很有用, 但在长 URL 和其他查询字符串参数的状况下能够会很痛楚。相反, 更好的要领是在 URL 途径中增加版本。比方:
api/v1/values
api/v2/values
照样上面的项目,只不过须要在v1和v2掌握器中到场,下面的代码。以下图所示:
一样, 您须要将路由参数更新到一切实用的位置。运用此变动, 在接见API 接口时老是须要有版本号。您能够经由过程 api/v1/values 接见到版本 1.0, 经由过程api/v2/values接见版本 2.0, 变动 URL 中的版本号。简朴, 看起来更清洁了。
测试效果以下:
三、经由过程HTTP Headers来完成版本掌握
在上述两种要领中, 须要修正 URL 以支撑版本掌握。然则, 假如您愿望 api 的URL 坚持清洁, 则 api 版本信息也能够经由过程附加 HTTP 报头来通报。要举行此事情, 您须要设置 ApiVersionReader 选项。代码以下:
凸起显现的行通知我们header "api-version" 如今是 api 版本号的预期位置。确保路由属性没有版本细致信息。所以测试它,效果以下:
当您将2.0 作为值供应给 "api 版本" 时, 它将挪用版本2.0 掌握器并返回输出。
简朴, 易于设置。然则, 如今查询字符串参数的要领举行版本掌握将不起作用。一旦设置了header, 就不能指定查询字符串参数。假如您愿望支撑这两种状况, 而不是 HeaderApiVersionReader, 请运用 QueryStringOrHeaderApiVersionReader。代码以下:
因而, 如今支撑查询字符串参数和header。默许查询字符串参数称号是 api-version, 因而您能够将组织函数留空, 但假如须要其他称号, 则须要供应。您还能够对查询字符串参数和标头运用有差别的称号。请记着, 我们还将 ReportApiVersions 设置为 true, 该值返回相应标头中的版本信息。见下图。
如今, 让我们来看看别的几个选项。
MapToApiVersion参数的用法:
MapToApiVersion 属性许可将单个 API 操纵映照到任何版本。换言之, 一个支撑多个版本的单掌握器。掌握器能够只要版本3支撑的 API 操纵要领。在这类状况下, 您能够运用 MapToApiVersion。看看下面的代码。
上面代码的意义是:public string Get()该要领只要在版本1.0中支撑,public string Getv3()要领只要在版本3.0中支撑。
有图有真像,很天真,我很喜欢。
Deprecated参数的用法:
当支撑多个 API 版本时, 某些版本最终会跟着时刻的推移而被弃用。要标记一个或多个 api 版本已被烧毁, 只需用Deprecated润饰您的掌握器。这并不意味着不支撑 API 版本。你依然能够挪用该版本。它只是一种让 挪用API 用户意想到以下版本在未来会被弃用。
上面把Deprecated设置为TRUE示意,版本1.0未来会被弃用。接见我们的API接口,能够在相应头中能够看到,下面信息,以下图所示:
ApiVersionNeutral特征的运用:
ApiVersionNeutral 特征定义此 API 不在支撑版本掌握。不管 支撑api 版本掌握或不支撑 api 版本掌握的旧式 api,这关于行动完全雷同的 api 异常有用。因而, 您能够增加 ApiVersionNeutral 属性以从版本掌握中退出。
猎取版本信息(Version Information)
假如你想晓得谁人版本的客户端在被接见,你能够经由过程下面的代码完成该功用:
综上所述, 具有多个版本的 API 能够协助以一种有用的体式格局推出加强的功用, 同时也便于跟踪变动。在这篇文章中, 我们看到了怎样在 ASP.NET coreWEB API 中增加对多个版本的支撑。nuget 包支撑经由过程查询字符串参数举行版本掌握, 在 URL 中增加途径段和经由过程标头。它还具有版本单一 API 操纵和从版本中挑选退出的功用。
能不能不借助第三方的包来完成一个API的版本掌握,要领是有的,不卖关子了,人人接着往下看。
四、最终版本(不借助任何NuGet包)asp.net core web api版本掌握
新建一个core API项目:
在VersionControl文件夹下面,新建一个完成了IApplicationModelConvention接口的类NameSpaceVersionRoutingConvention代码以下:
public class NameSpaceVersionRoutingConvention:IApplicationModelConvention { private readonly string apiPrefix; private const string urlTemplate = "{0}/{1}/{2}"; public NameSpaceVersionRoutingConvention(string apiPrefix = "api") { this.apiPrefix = apiPrefix; } public void Apply(ApplicationModel application) { foreach (var controller in application.Controllers) { var hasRouteAttribute = controller.Selectors .Any(x => x.AttributeRouteModel != null); if (!hasRouteAttribute) { continue; } var nameSpaces = controller.ControllerType.Namespace.Split('.'); //猎取namespace中版本号部份 var version = nameSpaces.FirstOrDefault(x => Regex.IsMatch(x, @"^v(\d+)$")); if (string.IsNullOrEmpty(version)) { continue; } string template = string.Format(urlTemplate, apiPrefix, version, controller.ControllerName); controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel() { Template = template }; } } }
调试代码发明这类体式格局只在顺序第一次运转的时刻会实行,以后不会再实行屡次,因而效力很高。
五、总结:
以上就是ASP.Net Core中关于WebApi几种版本掌握对照详解(图)的细致内容,更多请关注ki4网别的相干文章!