可以在不赋予每个控制器属性的情况下使用 AddApiVersioning() 吗?
Can AddApiVersioning() be used without attributing every controller?
我在我的 Asp.Net Web Api 2 api 中使用 config.AddApiVersioning()
在我的 WebApiConfig 中进行版本控制。我的每个控制器都装饰有类似 [Route("api/TestApi/v{version:apiVersion}/{action}/{id?}")]
.
的东西
我想删除大部分装饰,而是在我的 WebApiConfig:
中使用类似这样的东西
config.Routes.MapHttpRoute(
"ApiControllerVersionActionId",
"api/{controller}/v{version:apiVersion}/{action}/{id}",
new { id = UrlParameter.Optional },
new
{
// e.g., 1.0, 12.75
apiVersion = @"^[0-9]+\.[0-9]+$",
// only GUIDs or integers
id = @"^(\{){0,1}(\(){0,1}[0-9a-fA-F]{8}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{12}(\)){0,1}(\}){0,1}$|^\d+$"
}
);
我的问题:
- 这可能吗?
- 有例子吗?我发现的大多数示例都装饰了所有控制器。
我已经解决了这个问题,现在可以从我的控制器中删除所有 RouteAttribute
。
问题出在约束上。我已将我的 MapHttpRoute 修改为以下内容:
config.Routes.MapHttpRoute(
"ApiControllerVersionActionId",
"api/{controller}/v{apiVersion}/{action}/{id}",
new { id = UrlParameter.Optional },
new
{
apiVersion = new ApiVersionRouteConstraint(),
// empty string, guid, or int
id = @"^$|^(\{){0,1}(\(){0,1}[0-9a-fA-F]{8}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{12}(\)){0,1}(\}){0,1}$|^\d+$"
}
);
我想我还要提到,无论路由方法如何(基于约定的或基于属性的API Version Conventions,您都可以使用版本).有对命令式版本控制器的开箱即用支持,以及通过包含命名空间对版本进行约定。您还可以制定自己的约定来确定哪些 API 版本应用于控制器。
您将约定添加到配置中,如下所示:
options.Conventions.Add( new MyVersioningConvention() );
如果你想使用直接路由(又名属性路由),但又不想重复版本段完了,还有其他选择。您可以在 ASP.NET Web API 中使用以下任何方法:
- 扩展 RoutePrefixAttribute 并自动包含前缀(例如:ApiRoutePrefixAttribute)
- 创建一个自定义 IRoutePrefix,它可能会通过属性应用,但不一定是
- 扩展并替换 DefaultDirectRouteProvider
- 实施自定义 IDirectRouteProvider
我希望能提供一些其他有用的解决方案
我在我的 Asp.Net Web Api 2 api 中使用 config.AddApiVersioning()
在我的 WebApiConfig 中进行版本控制。我的每个控制器都装饰有类似 [Route("api/TestApi/v{version:apiVersion}/{action}/{id?}")]
.
我想删除大部分装饰,而是在我的 WebApiConfig:
中使用类似这样的东西config.Routes.MapHttpRoute(
"ApiControllerVersionActionId",
"api/{controller}/v{version:apiVersion}/{action}/{id}",
new { id = UrlParameter.Optional },
new
{
// e.g., 1.0, 12.75
apiVersion = @"^[0-9]+\.[0-9]+$",
// only GUIDs or integers
id = @"^(\{){0,1}(\(){0,1}[0-9a-fA-F]{8}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{12}(\)){0,1}(\}){0,1}$|^\d+$"
}
);
我的问题:
- 这可能吗?
- 有例子吗?我发现的大多数示例都装饰了所有控制器。
我已经解决了这个问题,现在可以从我的控制器中删除所有 RouteAttribute
。
问题出在约束上。我已将我的 MapHttpRoute 修改为以下内容:
config.Routes.MapHttpRoute(
"ApiControllerVersionActionId",
"api/{controller}/v{apiVersion}/{action}/{id}",
new { id = UrlParameter.Optional },
new
{
apiVersion = new ApiVersionRouteConstraint(),
// empty string, guid, or int
id = @"^$|^(\{){0,1}(\(){0,1}[0-9a-fA-F]{8}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{4}\-{0,1}[0-9a-fA-F]{12}(\)){0,1}(\}){0,1}$|^\d+$"
}
);
我想我还要提到,无论路由方法如何(基于约定的或基于属性的API Version Conventions,您都可以使用版本).有对命令式版本控制器的开箱即用支持,以及通过包含命名空间对版本进行约定。您还可以制定自己的约定来确定哪些 API 版本应用于控制器。
您将约定添加到配置中,如下所示:
options.Conventions.Add( new MyVersioningConvention() );
如果你想使用直接路由(又名属性路由),但又不想重复版本段完了,还有其他选择。您可以在 ASP.NET Web API 中使用以下任何方法:
- 扩展 RoutePrefixAttribute 并自动包含前缀(例如:ApiRoutePrefixAttribute)
- 创建一个自定义 IRoutePrefix,它可能会通过属性应用,但不一定是
- 扩展并替换 DefaultDirectRouteProvider
- 实施自定义 IDirectRouteProvider
我希望能提供一些其他有用的解决方案