在使用C#和.Net framework 4.5.1的MVC WEB API中,我有一个控制器名称MonitoringController
如下:
public class MonitoringController : ApiController
{
[HttpGet]
[ActionName("list")]
public IEnumerable<string> List(string collection)
{
return new String[] { "test 1", "test 2" };
}
}
我的路由配置是这样的:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.MapHttpAttributeRoutes();
config.EnsureInitialized();
api在获取请求时工作正常,例如http://localhost/api/monitoring/list?collection=test
如何应用路线属性以确保其适用于http://localhost/api/monitoring/ channels
/ list?collection = test
我认为我应该做的是:
[RoutePrefix("api/monitoring")]
public class MonitoringController : ApiController
{
[HttpGet]
[Route("channels")]
[ActionName("list")]
public IEnumerable<string> List(string collection)
{
return new String[] { "test 1", "test 2" };
}
}
我无法让http://localhost/api/monitoring/channels/list?collection=test
工作!我做错了什么?
我希望能够在控制器中定义以下路由:
感谢您的帮助
答案 0 :(得分:0)
尝试翻转您注册路线的顺序:
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
并将[Route("channels")]
更改为[Route("channels/list")]
并转储ActionName
属性。
更好的是,不要将两种方法混合在一起并进行属性路由。
如果您希望collection
成为路线的一部分,请使用路线参数。
[Route("{collection}/list")]
请参阅http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2