【问题标题】:C# webAPI restrict routeC# webAPI 限制路由
【发布时间】:2018-12-06 16:37:45
【问题描述】:

在一个 webapi 项目的 WebAPIConfig.cs 中,添加了 2 个路由

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

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

我尝试创建一个包含以下功能的 apiController

[HttpGet]
public string Get(int id)
{
    return "get";
}
[HttpGet]
[ActionName("ByWait")]
public string[] ByWait(int id)
{
    return "bywait";
}

我希望 请求 /api/controllername/1234 返回“get”,并且 请求 /api/controllername/bywait/1234 返回“bywait”。

但是,实际结果是 /api/controllername/1234 >> throw exception 找到与请求匹配的多个操作 /api/controllername/bywait/1234 >> “等待”

但是可以解决问题吗? s.t如何限制函数ByWait只接受包含动作的请求,使其只响应/api/controllername/bywait/1234并忽略/api/controllername/1234

或者有其他更好的解决方案?

谢谢

【问题讨论】:

  • “DefaultApi”路由配置应该在最后。这样特定的路由评估发生在默认路由映射之前。尝试在路由映射代码中将DefaultApi 放在ActionApi 之后。
  • 如果我改变 Maphttproute 的顺序。我什至无法成功调用 /api/controllername/1234,它抛出异常显示 1234 不是有效的操作名称

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


【解决方案1】:

首先你可以改变WebApiConfig:

config.Routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{id}"
);

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

然后是控制器:

[HttpGet]
public string Get()
{
    return "get-default";
}

[HttpGet]
public string Get(int id)
{
    return "get" + id;
}

[HttpGet]
[Route("api/values/bywait/{id}")]
public string ByWait(int id)
{
    return "bywait";
}

【讨论】:

  • 路由应该是 "api/test/bywait/{id}" 对于 bywait。 get with id 以某种方式无法通过 /api/test/5 调用。但可以通过 /api/test?id=5 请求。 nvm ,它可以解决问题。
猜你喜欢
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多