Asp.net WebAPI在控制器上未找到任何操作

Asp.net WebAPI在控制器上未找到任何操作,asp.net,asp.net-web-api,Asp.net,Asp.net Web Api,我收到一个错误-在与请求匹配的控制器“操作”上找不到任何操作 url是http://localhost:37331/api/action/FindByModule/1 我使用的路由是 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );

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

url是
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(),
               };
    }
}
公共类ActionController:ApicController
{
私有IActionRepository repository=null;
[HttpGet]
[行动名称(“全部”)]
公共IEnumerable All()
{
从此.repository.Get()中的操作返回
选择新JsonAction
{
ID=action.ID,
Text=action.Text.Trim(),
Description=action.Description.Trim(),
};
}
[HttpGet]
[ActionName(“FindByModule”)]
公共IEnumerable FindByModule(Int64 moduleId)
{
从此.repository.FindByModule(moduleId)中的操作返回
选择新JsonAction
{
ID=action.ID,
Text=action.Text.Trim(),
Description=action.Description.Trim(),
};
}
}

这是因为参数名称不匹配。从路由中,值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
第二种方法是更改URL,如下所示:

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描述路由egine工作原理的最简单方法是,它遍历您定义的所有规则(按照您定义的顺序),并使用第一个匹配的规则(这就是为什么最通用的规则应该放在最后的原因).@Alexander如果参数的值应取自路由,则路由定义中的令牌名称必须匹配,否则Web API将查找查询参数(也按名称)。