Asp.net web api 带控制器和不带控制器的Web Api路由
我有两个控制器 一个具有经典的REST功能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"; } } 使用此设
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 }
);