使用WebAPI Route属性

Mat*_*son 4 c# asp.net-mvc asp.net-mvc-routing asp.net-web-api

我有一些方法,我想遵循其URL的特定模式.

基本上有餐馆,有ID,还有一些终端.

我正试图让以下几种模式出现:api/Restaurant - 获取所有餐厅api /餐厅/ Bobs - 获取带有Bobs api /餐厅/ Bobs /终端ID的餐厅 - 获取bobs restaurant api的所有终端/餐厅/凸台/终端/秒 - 在餐厅鲍勃获得ID为秒的终端

我已经有了这样做的方法,并且我已经为每个分配了Route属性,如下所示:

    [HttpGet]
    public IEnumerable<IRestaurant> Get()
    {
        //do stuff, return all
    }

    [HttpGet]
        [Route("api/Restaurant/{restuarantName}")]
        public IRestaurant Get(string restaurantName)
        {
           //do stuff
        }

    [HttpGet]
    [Route("api/restuarant/{restaurantName}/terminals")]
    public IEnumerable<IMiseTerminalDevice> GetDevices(string restaurantName)
    {
       //do stuff
    } 

    [HttpGet]
    [Route("api/restaurant/{restaurantName}/terminals/{terminalName}")]
    public IMiseTerminalDevice GetDeviceByName(string restaurantName, string terminalName)
    {
        //do stuff
    }
Run Code Online (Sandbox Code Playgroud)

但是只有我的基本GET(api /餐厅)才有效.我的WebAPI配置是默认配置,并且读取

    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

    config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
Run Code Online (Sandbox Code Playgroud)

谁知道我哪里出错了?所有其他方法返回路由不匹配(​​带ID的餐馆)或404.

提前致谢!

Toa*_*yen 8

我刚刚创建了包含ProductsController的默认WEB API项目.接下来,我粘贴了你的api方法.

  public class ProductsController:ApiController
    {



        [HttpGet]
        [Route("api/Restaurant/{restaurantName}")]
        public IHttpActionResult Get(string restaurantName)
        {
            //do stuff
            return Ok("api/Restaurant/{restuarantName}");
        }

        [HttpGet]
        [Route("api/restuarant/{restaurantName}/terminals")]
        public IHttpActionResult GetDevices(string restaurantName)
        {
            //do stuff
            return Ok("api/restuarant/{restaurantName}/terminals");
        }

        [HttpGet]
        [Route("api/restaurant/{restaurantName}/terminals/{terminalName}")]
        public IHttpActionResult GetDeviceByName(string restaurantName, string terminalName)
        {
            //do stuff
            return Ok("api/restaurant/{restaurantName}/terminals/{terminalName}");
        }
    }
Run Code Online (Sandbox Code Playgroud)

最后,我用Fiddler提出请求

**http://localhost:9969/api/restuarant/Vanbeo/terminals**
Run Code Online (Sandbox Code Playgroud)

一切正常!

系统配置:Visual Studio 2013,WEB API 2.2,Net 4.5

你可以试试一个空项目吗?

PS:我必须将此作为答案发布,因为评论中没有足够的空间!