Asp.net web api 带控制器和不带控制器的Web Api路由

Asp.net web api 带控制器和不带控制器的Web Api路由,asp.net-web-api,asp.net-mvc-routing,asp.net-web-api2,Asp.net Web Api,Asp.net Mvc Routing,Asp.net Web Api2,我有两个控制器 一个具有经典的REST功能 public class ValuesController : ApiController { public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } public string Get(int id) { return "value"; } } 使用此设

我有两个控制器

一个具有经典的REST功能

public class ValuesController : ApiController
{
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
    public string Get(int id)
    {
        return "value";
    }
}
使用此设置

没有得到解决

如果我将DefaultApi放在DefaultApi2之前,然后尝试访问


我发现参数字典包含参数“id”的空条目

问题是您的路由定义不明确。例如,对于此URL:

< P>路由系统可以考虑1段是Debug TabI2路由中的动作,ID是NULL,因为您已经这样定义了。< /P> 因此,要消除歧义,需要使用路由约束。这允许您将规则添加到路线的不同分段,以便它们不会不匹配。请记住,路线是按注册顺序排列的

因此,例如,如果先注册DefaultApi,然后注册DefaultApi2,并添加一个要求第一个路由的Id为数字的约束,那么这两个路由都可以正常工作

您还可以在控制器名称上添加约束,或者为每种控制器使用不同的前缀,例如api/和api2/。情况是,这些路线可以相互区分

Google Web API路由约束,您将获得如下信息:

的MSDN文档是非常无用的

     public class Values2Controller : ApiController
{
    [HttpGet]
    public IEnumerable<string> GetAll()
    {
        return new string[] { "value2_1", "value2_2" };
    }
    [HttpGet]
    public string GetById(int id)
    {
        return "value " + id;
    }
}
   config.Routes.MapHttpRoute(
            name: "DefaultApi2",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

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