如何在API控制器中指定特定的URL?

时间:2014-06-18 19:40:41

标签: c# asp.net asp.net-mvc asp.net-mvc-4

现在,我的API控制器有两个方法:一个用于获取所有事件,另一个用于获取一个事件。

namespace HobbsEventsMobile.Controllers
{
    public class EventController : ApiController
    {
        // GET api/event
        [HttpGet]
        public List<HobbsEventsMobile.Models.Event> Get()
        {
            return HobbsEventsMobile.Models.Event.GetEventSummary();
        }

        // GET api/event/5
        [HttpGet]
        public HobbsEventsMobile.Models.Event Get(int id)
        {
            return HobbsEventsMobile.Models.Event.GetEventDetails(id);
        }
    }
}

新请求的功能要求我添加一种方法来调用本周的事件。我有一个存储过程和一个方法来调用它,但我不知道如何指定URL。我想补充一点:

[HttpGet]
public List<HobbsEventsMobile.Models.Event> Get()
{
    return HobbsEventsMobile.Models.Event.GetThisWeeksEvents();
}

但可以在m.mydomain.com/api/event/thisweek(或其他内容)访问它。 我该怎么做?

1 个答案:

答案 0 :(得分:2)

根据您正在运行的ASP.NET Web API版本,您有两种不同的选项。如果您使用的是版本1,则只需遵循基于约定的路由并使用:

public class EventController : ApiController
{
    [HttpGet]
    public List<HobbsEventsMobile.Models.Event> ThisWeek()
    {
        return HobbsEventsMobile.Models.Event.GetThisWeeksEvents();
    }
}

您还需要修改路由定义以支持操作名称(默认情况下,框架会根据HTTP谓词选择方法):

config.Routes.MapHttpRoute(
    "DefaultApiWithId",
    "api/{controller}/{id}",
    new { id = RouteParameter.Optional }, new { id = @"\d+" }
);

config.Routes.MapHttpRoute(
    "DefaultApiWithAction",
    "api/{controller}/{action}"
);

config.Routes.MapHttpRoute(
    "DefaultApiGet",
    "api/{controller}",
    new { action = "Get" },
    new { httpMethod = new HttpMethodConstraint("GET") }
);

如果你使用的是第二版,你仍然可以使用基于约定的路由,但你也可以使用属性路由:

public class EventController : ApiController
{
    [HttpGet]
    [Route("event/thisweek")]
    public List<HobbsEventsMobile.Models.Event> ICanNameThisWhateverIWant()
    {
        return HobbsEventsMobile.Models.Event.GetThisWeeksEvents();
    }
}