gpt4 book ai didi

asp.net - 带有 IHttpControllerSelector 的 AttributeRouting - Api 版本控制

转载 作者:行者123 更新时间:2023-12-01 05:00:11 25 4
gpt4 key购买 nike

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

我想要做的是通过它的命名空间来区分 Controller 的版本。

如果向/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 上。我不想在每个 Controller 上重复/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 }
);

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

有没有办法摆脱这种困境?

注意:对于 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 );

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

Controller 的设置简单地更改为:
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 版本的方法是使用当前实现(例如最新)。我个人不喜欢这种方法,因为我认为客户应该可以预测事情,但这将达到您想要的结果。

关于asp.net - 带有 IHttpControllerSelector 的 AttributeRouting - Api 版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33787209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com