加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 使用IHttpControllerSelector的AttributeRouting –

发布时间:2020-12-16 09:41:48 所属栏目:asp.Net 来源:网络整理
导读:我试图在asp.net webapi上使用CustomHttpControlSelector和AttributeRouting实现api版本控制. 我想要做的是通过它的命名空间来区分控制器的版本. 如果向/ api / v2 / foo / bar发出请求 我希望它匹配 namespace Web.Controllers.Api.v2{ [RoutePrefix("foo")
我试图在asp.net webapi上使用CustomHttpControlSelector和AttributeRouting实现api版本控制.

我想要做的是通过它的命名空间来区分控制器的版本.

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

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

request.GetRouteData().GetSubRoutes();

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

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

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上修改了代码

解决方法

我现在意识到这是一个老问题,但它可以使用 ASP.NET API Versioning包来回答 ASP.NET Web API.在最新的3.0版本中,您可以通过更新配置来实现您的方案:

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 );

您还应该删除基于约定的路由.如果您使用属性路由,则不需要这些.

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

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版本的方法是使用当前实现(例如最新).我个人不是这种方法的粉丝,因为我认为事情应该可以预测给客户,但这将达到你想要的结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读