首页 > 解决方案 > C# webAPI 限制路由

问题描述

在 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 >> "b​​y wait"

但是可以解决问题吗?st 如何限制函数 ByWait 只接受包含操作的请求,以便它只响应 /api/controllername/bywait/1234 并忽略 /api/controllername/1234

还是有其他更好的解决方案?

谢谢

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

解决方案


首先你可以改变 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";
}

推荐阅读