如何在此方案中设置Route属性?

时间:2015-10-11 03:31:38

标签: asp.net-web-api asp.net-web-api-routing

在使用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工作!我做错了什么?

我希望能够在控制器中定义以下路由:

  1. / API /监测/信道/列表
  2. / API /监测/窗/列表
  3. / API /监测/门/列表
  4. 感谢您的帮助

1 个答案:

答案 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