Asp.net WebAPI在控制器上未找到任何操作
我收到一个错误-在与请求匹配的控制器“操作”上找不到任何操作 url是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 } );
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将查找查询参数(也按名称)。