asp.net – 使用IHttpControllerSelector的AttributeRouting –
我试图在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版本的方法是使用当前实现(例如最新).我个人不是这种方法的粉丝,因为我认为事情应该可以预测给客户,但这将达到你想要的结果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 当HTTPContext .Current为Nothing时如何使用Ser
- 在ASP.Net 2.0应用程序中检查用户会话状态的状态和大小的最
- asp.net-mvc – 如何在ASP.NET MVC 2 RC中编写自定义客户端
- asp.net-mvc-4 – EF Code First,Model First或Db First?对
- asp.net – 如何删除日历的最后一周
- asp.net-mvc-3 – 在具有默认值的模型上注释属性
- 在ASP.net中使用NVP API时,PayPal SetExpressCheckout存在问
- asp.net – URL编码冒号在400 Bad Request中解析
- asp.net-mvc – ToDataSourceResult扩展不填充DataSourceRe
- asp.net-mvc – 如何在asp.net mvc中从https跳出到http模式
- asp.net-mvc – 关闭不显眼的验证运行时?
- 为什么ASP.NET自动生成的.designer代码的类型不正
- asp.net-mvc – MissingMethodException:“此对
- asp.net – 引用相同主键的两个外键
- asp.net-mvc-3 – 如何将模型传递给MVC 3 Razor“
- 在asp.net上调用两个函数按钮onclick
- 更改ASP.NET网站管理工具连接字符串
- asp.net-mvc-3 – ASP.MVC 3 Razor在Html.Partia
- ASP.NET Core本身已经集成了一个轻量级的IOC容器
- asp.net-mvc – ASP.NET MVC中Controller.ReadFr