Web Api路由与控制器和没有控制器结合在一起

时间:2015-05-08 19:33:19

标签: 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";
    }
}

和一个带有HttpAttributes

的自定义函数名称
     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 }
        );

使用此设置

http://localhost:xxxxx/api/Values2/1无法解决

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

http://localhost:xxxxx/api/Values2/GetAll

我得到&#34;参数字典包含参数&#39; id&#39;的空条目。 &#34;

1 个答案:

答案 0 :(得分:0)

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

http://localhost:xxxxx/api/Values2/1

路由系统可以考虑&#34; 1&#34;细分是DefaultApi2路线中的操作,而Id是空的,因为您已经这样定义了。

因此,要打破使用路径约束所需的歧义。这允许您将规则添加到路径的不同段,以便它们不会不匹配。请记住,路线按照注册顺序排列。

因此,例如,如果您先注册DefaultApi然后注册DefaultApi2,并添加一个约束,要求第一个路由的Id为数字,则两个路由都可以完美。

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

Google&#34; Web API路线约束&#34;,您将获得以下信息:

RouteCollectionExtensions.MapHttpRoute Method (RouteCollection, String, String, Object, Object)的MSDN文档非常无用。