【问题标题】:Attribute Routing in WEB API overwrite route in ControllerWEB API 中的属性路由覆盖控制器中的路由
【发布时间】:2015-02-27 19:35:07
【问题描述】:

我正在尝试向 ApiController 添加属性路由,如下所示:

public class PhoneNumbersController : ApiController
{
    // GET BY ID
    public PhoneNumber GetById(int id)
    {
        return PhoneNumbersSelect(id)[0];
    }

    // GET BY ID TypeOFPhoneNumbers/Id
    [Route("api/typeOfPhoneNumbers/{id}")]
    public TypeOfPhoneNumber GetTypeOfPhoneNumberById(int id)
    {
        return TypeOfPhoneNumbersSelect(id)[0];
    }
}

我的配置如下所示:

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

我在尝试调用 api/phoneNumbers/1 时收到 500 错误。如果我注释掉 GetTypeOfPhoneNumbersId() 函数,则默认控制器 GetById() 可以正常工作。我究竟做错了什么?由于配置的设置方式,我是否不允许在 ApiController 中声明唯一路由?

另外,正如我刚刚发现的,调用 api/typeOfPhoneNumbers/1 会返回 404 错误,因此路由根本不起作用。

感谢您的帮助!

【问题讨论】:

  • 路由是怎么配置的?
  • 我知道这是旧的但是...[Route("~/api/typeOfPhoneNumbers/{id}")]

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


【解决方案1】:

您可以尝试访问 TypeOFPhoneNumbers 的资源吗:~api/typeOfPhoneNumbers?id=1

【讨论】:

    【解决方案2】:

    我相信你错过了路由中的控制器名称(phoneNumbers),这是一个有效的代码(我已经测试过了)

    public class PhoneNumbersController : ApiController
    {
        // GET BY ID
        [HttpGet]
        public PhoneNumber GetById(int id)
        {
            return PhoneNumbersSelect(id)[0];
        }
    
        // GET BY ID TypeOFPhoneNumbers/Id
        [HttpGet]
        [Route("api/phoneNumbers/typeOfPhoneNumbers/{id:int}")]
        public TypeOfPhoneNumber GetTypeOfPhoneNumberById(int id)
        {
            return TypeOfPhoneNumbersSelect(id)[0];
        }
    }
    

    【讨论】:

    • 我想要这样的路由:'api/phoneNumbers/1' 'api/typeOfPhoneNumbers/1' 在同一个控制器上。
    猜你喜欢
    • 2016-07-12
    • 2023-03-26
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2015-05-04
    • 2021-08-12
    相关资源
    最近更新 更多