WebAPI控制器上未找到任何操作

Bot*_*Bao 53 asp.net asp.net-web-api

我收到一个错误 - 没有找到与请求匹配的控制器'Action'的操作.

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

我使用的路由是

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

控制器:

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(),
               };
    }
}
Run Code Online (Sandbox Code Playgroud)

tpe*_*zek 111

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

第一个选择是改变你的路线,如下所示:

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

其次是像这样更改你的URL:

http://localhost:37331/api/action/FindByModule?moduleId=1
Run Code Online (Sandbox Code Playgroud)

所以参数名称匹配.

  • 谢谢@tpeczek,我没有意识到参数名必须与路由模板匹配. (6认同)
  • @evc您需要为这两个操作分别制定规则.如果它们位于不同的控制器中,那么您可以将控制器放入路径而不是占位符.如果它们位于同一控制器中,则需要将这两个操作名称放在不同的规则中.还请记得把一般路线放在最后. (2认同)