【问题标题】:Web API Routing {controller}/{action}/{id} vs default routingWeb API 路由 {controller}/{action}/{id} 与默认路由
【发布时间】:2017-10-18 14:55:14
【问题描述】:

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

  1. api/User/123
  2. api/User/UsersOfCompany?id=123&pageIndex=0&pageSize=20
  3. api/User/AllowedCompanies?id=123&pageIndex=0&pageSize=10

这是我的实际代码。

用户控制器

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());
    }
}

路由配置

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)

但是,现在我只能调用最后 2 个请求(UsersOfCompany、AllowedCompanies)。 当我调用 api/User/123 时,我收到此错误:

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

我已经尝试颠倒路由注册的顺序,但我得到了相反的行为,因此api/User/123 呼叫有效,而其他两个无效。

问题出在哪里?

【问题讨论】:

  • 您要我们找出什么问题?有错误信息吗?如果是这样,它发生在何时何地?
  • 抱歉...更新了问题! :-)

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    相关资源
    最近更新 更多