基本常规路由asp.net webapi

时间:2017-08-20 04:04:24

标签: c# asp.net-web-api asp.net-web-api-routing

我对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)?如果没有,为什么不尝试第二条路线?

1 个答案:

答案 0 :(得分:0)

此路线模板

config.Routes.MapHttpRoute(name:"DefaultApi",
    routeTemplate:"api/{controller}/{id}",
    defaults:new {id = RouteParameter.Optional}
);

匹配您的网址,因为Id可以是任何类型:stringint等。因此,您的网址尊重此模板并选择此路线。

要使此模板更具有分析性并使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 ,系统会跳过上述模板,然后选择下一个模板。