首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AttributeRouting与IHttpControllerSelector - Api版本控制

AttributeRouting与IHttpControllerSelector - Api版本控制
EN

Stack Overflow用户
提问于 2015-11-18 18:08:20
回答 1查看 640关注 0票数 4

我正在尝试使用CustomHttpControlSelector和AttributeRouting在asp.net webapi上实现asp.net版本控制。

我想要做的是区分控制器的版本和它的名称空间。

如果向/api/v2/foo/bar发出请求,则希望它匹配。

代码语言:javascript
复制
namespace Web.Controllers.Api.v2
{
    [RoutePrefix("foo")]
    public class LongerThanFooController : ApiController
    {
        [HttpGet]
        [Route("bar")]
        public string BarFunction()
        {
            return "foobar";
        }
    }
}

但是,正如我所看到的,当我不对RoutePrefix (/api/v2/foo)使用完整的url时,属性路由不会启动,当我调用时会得到null。

代码语言:javascript
复制
 request.GetRouteData().GetSubRoutes();

在我的CustomHttpControlSelector上我不想在每个控制器上重复/api/v2。

如果我决定删除attributeRouting并使用手动路由,如

代码语言:javascript
复制
 config.Routes.MapHttpRoute(
         name: "DefaultVersionedApi",
         routeTemplate: "api/v{version}/{controller}/{id}",
         defaults: new { id = RouteParameter.Optional }
 );

 config.Routes.MapHttpRoute(
          name: "DefaultApi",
          routeTemplate: "api/{controller}/{id}",
          defaults: new { id = RouteParameter.Optional, version = Config.LatestVersion }
  );

我失去了命名控制器和函数的所有灵活性。

有办法摆脱困境吗?

注意:对于CustomHttpControlSelector,我在http://aspnet.codeplex.com/SourceControl/changeset/view/dd207952fa86#Samples/WebApi/NamespaceControllerSelector/NamespaceHttpControllerSelector.cs上修改了代码

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-22 00:08:52

我现在意识到这是一个老生常谈的问题,但它可以使用ASP.NET API版本化包来回答ASP.NET网络API。在最新的3.0版本中,您可以通过以下方式更新配置来实现您的场景:

代码语言:javascript
复制
var constraintResolver = new DefaultInlineConstraintResolver()
{
  ConstraintMap =
  {
    ["apiVersion"] = typeof( ApiVersionRouteConstraint )
  }
};

configuration.AddApiVersioning(
  options =>
  {
    options.Conventions.Add( new VersionByNamespaceConvention() );
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.ApiVersionSelector = new CurrentImplementationApiVersionSelector( options );
  } );

configuration.MapHttpAttributeRoutes( constraintResolver );

您还应该删除基于约定的路由。如果您使用属性路由,则这些操作是不必要的。

控制器的设置只需更改为:

代码语言:javascript
复制
namespace Web.Controllers.Api.v2
{
  [RoutePrefix("api")]
  public class LongerThanFooController : ApiController
  {
    [HttpGet]
    [Route("foo/bar")]
    [Route("v{version:apiVersion}/foo/bar")]
    public string BarFunction()
    {
      return "foobar";
    }
  }
}

需要两个路由定义的原因是,不能在路由模板的中间设置的默认值。默认值只能在末尾使用。这也意味着您需要允许不指定API版本,并指出选择哪个API版本的方式是使用当前实现(例如最新实现)。我个人不喜欢这种方法,因为我认为对客户来说,事情应该是可以预测的,但是这样会达到你想要的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33787209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档