Web API路由{controller} / {action} / {id} vs默认路由

时间:2017-10-18 14:55:15

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

我想创建一个可以响应这些请求的控制器:

  1. API /用户/ 123
  2. API /用户/ UsersOfCompany ID = 123&安培;的PageIndex = 0&安培;的pageSize = 20
  3. API /用户/ AllowedCompanies ID = 123&安培;的PageIndex = 0&安培;的pageSize = 10
  4. 这是我的实际代码。

    用户控制器

    public class UserController : ApiController
    {
        [HttpGet]
        public IHttpActionResult Get(int id)
        {
            //... implementation...
        }
    
        [HttpGet]
        [ActionName("UsersOfCompany")]
        public IHttpActionResult UsersOfCompany(int id, [FromUri] Paging paging)
        {
            //... implementation...
        }
    
        [HttpGet]
        [ActionName("AllowedCompanies")]
        public IHttpActionResult AllowedCompanies(int id, [FromUri] Paging paging)
        {
            //... implementation...
        }
    }
    

    WebApiConfig

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Servizi e configurazione dell'API Web
    
            // Route dell'API Web
            config.MapHttpAttributeRoutes();
    
            config.Routes.MapHttpRoute(
                name: "ApiWithActionName",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
    
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
    
            config.MessageHandlers.Add(new LanguageMessageHandler());
        }
    }
    

    RouteConfig

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
    

    根据上面的示例请求,我希望以这种方式进行路由工作:

    1. Get(int id)
    2. UsersOfCompany(int id, [FromUri] Paging paging)
    3. AllowedCompanies(int id, [FromUri] Paging paging)
    4. 但是,现在我只能调用最后2个请求(UsersOfCompany,AllowedCompanies)。 当我调用api / User / 123时出现此错误:

        

      “找不到与请求的网址'Service / api / User / 123'匹配的HTTP资源。”,   “无法在名为'42887'的'用户'控制器上找到操作。”

      我已经尝试颠倒路由注册的顺序,但我发现了相反的行为,因此api/User/123调用有效而其他两个没有。

      问题出在哪里?

1 个答案:

答案 0 :(得分:3)

您的错误消息明确指出WebApi尝试将Service/api/User/123与第一种模式匹配:api/{controller}/{action}/{id}

您可以尝试更改WebApiConfig中的注册顺序或明确指定路线:

[Route("api/User/{id:int}")]
[HttpGet]
public IHttpActionResult Get(int id)
{
    //... implementation...
}