2017-01-23 185 views
0

我在我的ASP.NET Web API配置下列路线2项目:从路由配置到属性路由

 config.Routes.MapHttpRoute(
      name: "1MandatoryStringParameter", 
      routeTemplate: "api/{controller}/{data}", 
      defaults: null, 
      constraints: new { data = @".+?" } 

它用于下列的控制器方法(注意ArrayInput属性):

[ArrayInput("data",Separator = ',')] 
public async Task<IHttpActionResult> Get(int[] data) 
{ 
... 
} 

我想用Attribute路由代替。

我试图调用具有以下属性替换到MapHttpRoute

[HttpGet] 
[Route("api/ActionsForItemTypesList/{data:regex(.+?)}", Name = "1MandatoryStringParameter")] 

出它不工作的开箱。我无法通过以下URL访问我的方法:

api/ActionsForItemTypesList/1,2 

如果找不到404方法,

这与路由配置工作正常。

任何帮助表示赞赏。

编辑:修正了客户端的URL。

编辑2:这是一个问题ApiExplorer(Swashbuckle杠杆ApiExplorer)

如果我修改路由属性并取出ApiDescription变为可用的参数(即{}数据)。

+0

两件事。您可以为int数组创建自定义路由约束和自定义模型绑定器。 [ASP.NET Web API 2中的属性路由](https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2) – Nkosi

回答

0

确保已启用属性路由:

config.MapHttpAttributeRoutes(); 

而且在你Route属性已指定了data参数必须是路径的一部分,而不是一个查询字符串。因此,请确保您正确地从客户端调用动作:

api/ActionsForItemTypesList/1,2 

另请注意,您在路由属性指定的前缀是api/ActionsForItemTypesList,而不是像api/Controller你试图调用它。

+0

属性路由已启用,来自客户端的呼叫按照您的说法完成。对于它的价值,我使用了Swashbuckle和Route Debugger。通过属性路由,该方法从swagger doc中丢失。 –

+0

我刚刚创建了一个新的Web API项目,删除了全局路由,启用了属性路由,使用此属性修饰了控制器操作,并且没有任何问题。尝试在一个干净的项目中做,并逐步添加东西,直到找到造成问题的原因。 –

+0

修正了网址。现在我正在使用全局和属性路由的混合。我的目标是只使用属性路由。 –