.NET Core API版本控制:MapToApiVersion版本响应异常问询
问题分析与解决方案
这不是库的bug,是你对ApiVersioning库的响应头逻辑理解有偏差。
原因说明
当你在控制器上标记了[ApiVersion("1.0"), ApiVersion("2.0")]时,库会默认将控制器声明的所有版本都放入Api-Supported-Versions响应头中——这个头的作用是标识当前请求对应的控制器整体支持的版本范围,而非单个接口方法的支持版本。哪怕你给某个方法单独指定了[MapToApiVersion("2.0")],只要控制器本身声明了支持1.0和2.0,响应头就会显示两个版本,这是库的设计逻辑,而非bug。
不重复代码的解决方案
不用拆分整个控制器写重复代码,你可以通过基类+版本化控制器继承的方式解决:
- 抽离公共逻辑到基类控制器(比如
BaseTestController),不要给基类标记任何ApiVersion特性; - 创建
TestControllerV1继承基类,标记[ApiVersion("1.0")],存放1.0版本的接口方法; - 创建
TestControllerV2继承基类,标记[ApiVersion("2.0")],存放2.0版本新增的AddedIn2方法; - 路由配置保持和之前一致,比如用
[Route("api/v{version:apiVersion}/test")]。
这种方式既避免了代码重复,又能让每个版本控制器只声明自己支持的版本,此时请求1.0版本时,Api-Supported-Versions头只会显示1.0,符合你的预期。
额外说明
如果坚持要在同一个控制器中混合多版本方法,又想调整响应头,你可以自定义IApiVersionResponseProvider来改写Api-Supported-Versions的内容,但这种方式需要额外的代码开发,不如继承方案简洁直观。
内容的提问来源于stack exchange,提问作者Dipendu Paul
相关产品推荐
相关产品推荐

