我有两个控制器。
具有经典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;
答案 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文档非常无用。