【问题标题】:WebAPI No action was found on the controllerWebAPI 在控制器上未找到任何操作
【发布时间】:2013-01-07 01:02:07
【问题描述】:

我收到一个错误 - 在控制器“操作”上找不到与请求匹配的操作。

网址是http://localhost:37331/api/action/FindByModule/1

我使用的路由是

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

控制器:

public class ActionController : ApiController
{
    private IActionRepository repository = null;

    [HttpGet]
    [ActionName("All")]
    public IEnumerable<JsonAction> All()
    {
        return from action in this.repository.Get()
               select new JsonAction
               {
                   ID = action.ID,
                   Text = action.Text.Trim(),
                   Description = action.Description.Trim(),
               };
    }

    [HttpGet]
    [ActionName("FindByModule")]
    public IEnumerable<JsonAction> FindByModule(Int64 moduleId)
    {
        return from action in this.repository.FindByModule(moduleId)
               select new JsonAction
               {
                   ID = action.ID,
                   Text = action.Text.Trim(),
                   Description = action.Description.Trim(),
               };
    }
}

【问题讨论】:

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


    【解决方案1】:

    这是因为参数名称不匹配。从您的路线中,值 1 被分配给名为 id 的参数,并且您的操作正在寻找名为 moduleId 的参数。

    第一个选择是像这样改变你的路线:

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

    第二个是像这样改变你的网址:

    http://localhost:37331/api/action/FindByModule?moduleId=1
    

    所以参数名称匹配。

    【讨论】:

    • 谢谢@tpeczek,我没有意识到参数名称必须与路由模板匹配。
    • 如果在一个动作中我有 moduleId,而在另一个 captionId 中,如何在不匹配的情况下拾取两者?
    • @evc 您需要为这两个操作设置单独的规则。如果它们在不同的控制器中,那么您必须将控制器放入路由而不是占位符。如果它们在同一个控制器中,则您需要将这两个操作名称放入单独的规则中。另外请记得把一般路线放在最后。
    • @evc 描述路由引擎如何工作的最简单方法是说它遍历您定义的所有规则(按照您定义它们的顺序)并使用第一个匹配的规则(这就是为什么最普遍的规则应该放在最后)。
    • @Alexander 如果参数的值应该取自路由,则路由定义中的令牌名称必须匹配,否则 Web API 将查找查询参数(也按名称)。
    猜你喜欢
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2013-04-24
    • 1970-01-01
    相关资源
    最近更新 更多