【问题标题】:webapi multiple methods in MapHttpRouteMapHttpRoute中的webapi多个方法
【发布时间】:2017-11-09 17:48:06
【问题描述】:

在 asp.net core 中使用路由注释我可以很容易地做到以下几点

[HttpGet("ByID/{id}")]
public int GetByID(int id)
{
    return 5;
}

[HttpGet("ByName/{id}")]
public string GetByName(string name)
{
    return "neil";
}

但是,使用控制器中的相同方法,您如何使用 WebApiConfig 文件(即 .net 框架)中的非注释方式来执行此操作,即我在下面添加什么以使其适用于上述示例.

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

作为奖励,有人可以告诉我如何将相同的 URL 映射到仅按类型区分的两个 GET 项,例如

[HttpGet("{id}")]
[HttpGet("{name}")]

其中一个是整数,一个是字符串 - 换句话说,与上述相同,但不必指定两个单独的 url 段(ByID,ByName)?

【问题讨论】:

  • 我想出了第一部分,即进行多次 MapHttpRoute 调用并使用操作设置名称。不知道这是不是最好的方法:默认值:new { id = RouteParameter.Optional, action = "GetByName" } 所以唯一的事情,假设这是正确的,你如何拥有相同的 url 只是按类型区分。
  • 你需要的是路由约束

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


【解决方案1】:

您可以使用路由约束来区分同一路径的操作。

[RoutePrefix("api/somepath")]
public class MyController : ApiController {

    //Matches GET api/somepath/5
    [HttpGet]
    [Route("{id:int}")]
    public int GetByID(int id) {
        return id;
    }

    //Matches GET api/somepath/neil
    [HttpGet]
    [Route("{name}")]
    public string GetByName(string name) {
        return name;
    }
}

注意默认是字符串,这就是为什么第二个动作没有。

【讨论】:

  • 谢谢。那么,当注释不在时(即非核心 asp.net 应用程序)如何完成 - 我是否在 MapHttpRoute 方法中添加一个带有规范“动作”的约束?
  • @NeilWalker 是核心或 web api 2
猜你喜欢
  • 2015-10-14
  • 2023-03-21
  • 1970-01-01
  • 2016-11-27
  • 2021-08-15
  • 2017-05-19
  • 1970-01-01
  • 2014-01-06
  • 2018-05-20
相关资源
最近更新 更多