我对ASP.Net Web API路由有一个简单的查询。我有以下控制器:
import actionCreators from 'actions'
console.log(actionCreators); // { setX, setY, setT }
我的路由配置(常规)如下所示:
public class CustomersController: ApiController
{
public List<SomeClass> Get(string searchTerm)
{
if(String.IsNullOrEmpty(searchTerm))
{
//return complete List
}
else
{
//return list.where (Customer name contains searchTerm)
}
}
}
如果我点击了网址: http://localhost:57169/api/Customers/Vi 我得到了404-Not found
如果我颠倒路线的顺序,它就有效。 所以问题是在第一种情况下,是否匹配第一条路线(DefaultApi)?如果没有,为什么不尝试第二条路线?
答案 0 :(得分:0)
此路线模板
config.Routes.MapHttpRoute(name:"DefaultApi",
routeTemplate:"api/{controller}/{id}",
defaults:new {id = RouteParameter.Optional}
);
匹配您的网址,因为Id
可以是任何类型:string
,int
等。因此,您的网址尊重此模板并选择此路线。
要使此模板更具有分析性并使ASP.Net Web API转到下一个模板,您需要通过说出&#34; Id
参数之类的内容来添加一些约束。此模板的数字类型&#34;。因此,您可以添加constraints
参数,如下所示:
config.Routes.MapHttpRoute(name:"DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new {id = RouteParameter.Required}, // <- also here I put Required to make sure that when your user doesn't give searchTerm so this template will not be chosen.
constraints: new {id = @"\d+"} // <- regular expression is used to say that id must be numeric value for this template.
);
因此,使用此网址 http://localhost:57169/api/Customers/Vi ,系统会跳过上述模板,然后选择下一个模板。