网站首页> 文章专栏> Asp.Net.Core WebApi 版本控制
Asp.Net.Core WebApi 版本控制
日期:2020-04-30 10:17:59 作者:dotNET跨平台 来源: dotNET跨平台 浏览量:158

\n Microsoft.AspNetCore.Mvc.Versioning 是一个微软官方推出的一个用于管理Api版本的包,配置简单,功能强大。 github地址.\n

\n

\n 新建一个WebApi项目并通过命令引用包。\n

\n

\n Install-Package Microsoft.AspNetCore.Mvc.Versioning \n

\n

\n 最新版本已经支持Core3.1\n

\n

\n 在 Startup 的 ConfigureServices 中增加以下配置。 \n

\n

\n
\n

\n
services.AddApiVersioning(options =>\n{\n    options.ReportApiVersions = true; \n    options.AssumeDefaultVersionWhenUnspecified = true; \n    options.DefaultApiVersion = new ApiVersion(1, 0); \n});
\n
    \n
  • \n ReportApiVersions:是否在请求头中返回受支持的版本信息。 \n
  • \n
  • \n AssumeDefaultVersionWhenUnspecified:请求没有指明版本的情况下是否使用默认的版本。 \n
  • \n
  • \n DefaultApiVersion:默认的版本号。\n
  • \n
\n

\n 通过QueryString进行版本控制 \n

\n

\n 分别在两个不同的Controller中添加一个获取版本信息的接口
\n
\n

\n

\n \n

\n
namespace version.Controllers.v1\n{\n    [ApiVersion(\"1.0\")]\n    [ApiController]\n    [Route(\"api/[controller]\")]\n    public class ValuesController : Controller\n    {\n        [HttpGet(\"version\")]\n        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());\n    }\n}
\n
namespace version.Controllers.v2\n{\n    [ApiVersion(\"2.0\")]\n    [ApiController]\n    [Route(\"api/[controller]\")]\n    public class ValuesController : Controller\n    {\n        [HttpGet(\"version\")]\n        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());\n    }\n}
\n

\n HttpContext.GetRequestedApiVersion().ToString() 是用于获取请求接口的版本信息。\n

\n

\n 我们通过postman来请求这两个接口当我们没有给到具体请求哪个版本的时候会根据在ConfigureServices中配置的默认版本去执行。\n

\n

\n \"\"\n

\n

\n 指定版本请求结果\n

\n

\n \"\"\n

\n

\n \"\"\n

\n

\n 在响应头中会显示当前支持的所有的Api版本\"\"\n

\n

\n

\n 通过URL Path进行版本控制\n

\n

\n 一般在Api开发中不会去QueryString的方式去进行版本控制,而是使用URL路径段的方式来控制版本。\n

\n

\n 修改两个Controller中的代码如下。\n

\n

\n

namespace version.Controllers.v1\n{\n    [ApiVersion(\"1.0\")]\n    [ApiController]\n    [Route(\"api/v{version:ApiVersion}/[controller]\")]\n    public class ValuesController : Controller\n    {\n        [HttpGet(\"version\")]\n        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());\n    }\n}
\n
namespace version.Controllers.v2\n{\n    [ApiVersion(\"2.0\")]\n    [ApiController]\n    [Route(\"api/v{version:ApiVersion}/[controller]\")]\n    public class ValuesController : Controller\n    {\n        [HttpGet(\"version\")]\n        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());\n    }\n}
\n通过postman进行测试\n

\n

\n
\n

\n

\n \"\"\n

\n

\n \"\"\n

\n

\n

\n \"\"\n

\n

\n

\n 可以看到当我们使用指定的版本是可以正常访问的时候,但是如果我们去掉了Api版本号就会抛出404,并不能像QueryString一样调用默认的Api版本,因为URL Path的方式不允许隐式匹配设置的默认Api版本。所以必须申明所有的Api版本。且在请求Api同时必须带上Api版本号。\n

\n

\n 通过Media Type进行版本控制\n

\n

\n 我们还可以使用content-type来实现版本的控制\n

\n

\n 修改ConfigureServices中的配置\n

\n
services.AddApiVersioning(options =>\n{\n    options.ApiVersionReader = new MediaTypeApiVersionReader();\n    options.AssumeDefaultVersionWhenUnspecified = true;\n    options.ApiVersionSelector = new CurrentImplementationApiVersionSelector(options);\n\n});
\n

\n CurrentImplementationApiVersionSelector 如果没有在content-type中传递Api版本好,将默认匹配最新的Api版本\n

\n

\n 分别修改两个Controller\n

\n
namespace version.Controllers.v1\n{\n    [ApiVersion(\"1.0\")]\n    [ApiController]\n    [Route(\"api/[controller]\")]\n    public class ValuesController : Controller\n    {\n        [HttpGet(\"version\")]\n        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());\n    }\n}
\n
namespace version.Controllers.v2\n{\n    [ApiVersion(\"2.0\")]\n    [ApiController]\n    [Route(\"api/[controller]\")]\n    public class ValuesController : Controller\n    {\n        [HttpGet(\"version\")]\n        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());\n    }\n}
\n使用Postman测试\n

\n

\n \"\"\n

\n

\n

\n 通过自定义Headers进行版本控制
\n

\n

\n 修改ConfigureServices中的配置\n

\n
services.AddControllers();\nservices.AddApiVersioning(options =>\n{\n    options.ReportApiVersions = true;\n    options.ApiVersionReader = new HeaderApiVersionReader(\"api_version\");\n    options.AssumeDefaultVersionWhenUnspecified = true;\n    options.DefaultApiVersion = new ApiVersion(1, 0);\n});
\n

\n api_version 是你Headers中Key的名字。\n

\n

\n

\n 特性\n

\n

\n 当哪个Api版本不在更新,就需要弃用掉这个版本。当Deprecated值为true时说明该Api版本已经已经弃用,但是弃用不代表不能请求。只是会在响应头中告知次版本已经已经弃用。\n

\n

\n

namespace version.Controllers.v1\n{\n    [ApiVersion(\"1.0\",Deprecated= true)]\n    [ApiController]\n    [Route(\"api/[controller]\")]\n    public class ValuesController : Controller\n    {\n        [HttpGet(\"version\")]\n        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());\n    }\n}
\n\"\"\n

\n

\n 项目总有一些功能是不需要版本的控制,所以我们希望它不受版本控制。可以添加[ApiVersionNeutral]特性使Api支持版本控制。\n

\n

\n

namespace version.Controllers.v1\n{\n    [ApiVersionNeutral]\n    [ApiController]\n    [Route(\"api/[controller]\")]\n    public class ValuesController : Controller\n    {\n        [HttpGet(\"version\")]\n        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());\n    }\n}
\nMapToApiVersion 可以将单个Api归类于任何版本。在一个Controller中可以存在多个版本的Api。我们可以配合Deprecated来灵活的控制我们的Api。\n

\n

\n

namespace version.Controllers.v1\n{\n    [ApiVersion(\"3.0\")]\n    [ApiVersion(\"1.0\",Deprecated= true)]\n    [ApiController]\n    [Route(\"api/v{version:ApiVersion}/[controller]\")]\n    public class ValuesController : Controller\n    {\n        [HttpGet(\"version\"), MapToApiVersion(\"1.0\")]\n        public string Version() => (HttpContext.GetRequestedApiVersion().ToString());\n\n        [HttpGet(\"version3\"), MapToApiVersion(\"3.0\")]\n        public string Version3() => (HttpContext.GetRequestedApiVersion().ToString());\n    }\n}
\n

\n

\n

\n

\n
\n

热门文章
    随便看看