0

我在下面关注: https ://www.hanselman.com/blog/ASPNETCoreRESTfulWebAPIVersioningMadeEasy.aspx

是否可以直接为 Web api 控制器提供更高版本。喜欢:

ApiVersion("2.05")]   
[RoutePrefix("api/v{version:apiVersion}/ger")]
public class caGerController
[Route("~/api/ger/getDetail")]
[Route("getDetail")]
 GetGerData

使用上述一个时,它仅在使用 URL as 时有效,但在使用 URL as和获取消息api/v2.05/ger/getDetail 时失败api/ger/getDetail"Code": "ApiVersionUnspecified",

如果将版本从 2.05 更改为 1.0(与所有其他控制器一样),则api/ger/getDetail可以使用。

如何解决这个问题,我需要这个控制器的 2.05 并且还需要访问api/ger/getDetailURL。

谢谢

4

1 回答 1

2

由于您是按 URL 段进行版本控制,因此您必须做一些事情。首先在选项中,您需要允许使用隐式版本控制:

options.AssumeDefaultVersionWhenUnspecified = true;

您的原始 API 有一些从未声明或命名的版本。默认配置将使用“1.0”。如果您希望默认设置为其他值,请指定:

options.DefaultApiVersion = new ApiVersion( 2, 0 );

下一步是您必须将路由模板浮动到您希望拥有默认路径的控制器上。ASP.NET 和我知道的所有其他堆栈都无法在路由模板的中间提供或填充默认值。

如果“2.0”是您的初始默认版本,那么您的控制器将如下所示:

[ApiVersion( "2.0" )]
[ApiVersion( "2.05" )]
[RoutePrefix( "api" )]
public class GerController : ApiController
{
    [Route( "ger/getDetails" )]
    [Route( "v{version:apiVersion}/ger/getDetails" )]
    public IHttpActionResult GetDetails() => Ok();
}

如果您更改映射到默认路由的控制器,则必须将路由模板移动到该新控制器类型。

这是按 URL 段进行版本控制的不幸结果。如果您不更改默认路由映射,那么管理起来应该没什么大不了的;否则,您应该考虑禁止隐式版本控制或选择替代版本控制方法。

有关更多信息,请参阅此wiki主题。

于 2018-03-26T00:33:07.950 回答