C# 带有ActionNames的MVC4 WebApi路由不允许通用;获得;
我在尝试使用多个“Get”方法时遇到了问题,同时默认值为/api/{controller}。下面是一个带有伪代码的示例(是的,我知道它将返回完全相同的结果) 错误:C# 带有ActionNames的MVC4 WebApi路由不允许通用;获得;,c#,asp.net-mvc-4,asp.net-web-api,C#,Asp.net Mvc 4,Asp.net Web Api,我在尝试使用多个“Get”方法时遇到了问题,同时默认值为/api/{controller}。下面是一个带有伪代码的示例(是的,我知道它将返回完全相同的结果) 错误:“当我尝试转到/api/courses 去/api/courses/all工作很好,/api/courses/3 // GET api/courses public IEnumerable<Courses> Get() { return Db.Courses.OrderBy(x => x.Name); }
“当我尝试转到/api/courses
去/api/courses/all
工作很好,/api/courses/3
// GET api/courses
public IEnumerable<Courses> Get()
{
return Db.Courses.OrderBy(x => x.Name);
}
// GET api/courses/all
[ActionName("all")]
public IEnumerable<Courses> GetAll()
{
return Db.Courses.OrderBy(x => x.Name);
}
// GET api/courses/id
[ActionName("all")]
public Courses Get(int id)
{
return Db.Courses.Where(x => x.id == id);
}
我想做的是打电话:
/api/courses - returns Get()
/api/courses/all - returns GetAll()
/api/courses/3 - returns Get(id = 3)
编辑:
它还需要考虑到Put、Post等功能,例如在/api/courses上放置
课程/
错误:“当我尝试转到/api/courses时发现多个操作与请求匹配”
通过将apicontrolly
路由的默认操作指定为“Get”,我能够让/api/courses
工作。这适用于您的场景吗
routes.MapHttpRoute(
name: "ApiControllerOnly",
routeTemplate: "api/{controller}",
defaults: new { action = "Get" }
);
编辑:
如果您在APIController中有附加的PoT/POST/ETC方法,您应该考虑在<代码> ApCoptoLLReNe> < /C>路由上使用<代码> HttpMethodConstraint <代码>,并为PUT/POST/ETC方法添加另一个路由(即<>代码> ApCoptoLL)/ <代码>:
config.Routes.MapHttpRoute(
name: "ApiControllerOnly",
routeTemplate: "api/{controller}",
defaults: new { action = @"Get" },
constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);
config.Routes.MapHttpRoute(
name: "ApiControllerOnly2",
routeTemplate: "api/{controller}"
);
config.Routes.MapHttpRoute(
name: "ApiControllerAndIntegerId",
routeTemplate: "api/{controller}/{id}",
defaults: null,
constraints: new { id = @"^\d+$" }
);
config.Routes.MapHttpRoute(
name: "ApiControllerAction",
routeTemplate: "api/{controller}/{action}"
);
错误:“当我尝试转到/api/courses时发现多个操作与请求匹配”
通过将apicontrolly
路由的默认操作指定为“Get”,我能够让/api/courses
工作。这适用于您的场景吗
routes.MapHttpRoute(
name: "ApiControllerOnly",
routeTemplate: "api/{controller}",
defaults: new { action = "Get" }
);
编辑:
如果您在APIController中有附加的PoT/POST/ETC方法,您应该考虑在<代码> ApCoptoLLReNe> < /C>路由上使用<代码> HttpMethodConstraint <代码>,并为PUT/POST/ETC方法添加另一个路由(即<>代码> ApCoptoLL)/ <代码>:
config.Routes.MapHttpRoute(
name: "ApiControllerOnly",
routeTemplate: "api/{controller}",
defaults: new { action = @"Get" },
constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);
config.Routes.MapHttpRoute(
name: "ApiControllerOnly2",
routeTemplate: "api/{controller}"
);
config.Routes.MapHttpRoute(
name: "ApiControllerAndIntegerId",
routeTemplate: "api/{controller}/{id}",
defaults: null,
constraints: new { id = @"^\d+$" }
);
config.Routes.MapHttpRoute(
name: "ApiControllerAction",
routeTemplate: "api/{controller}/{action}"
);
哇,我想把事情弄得太复杂了。。。我必须删除第一个路由才能让它工作,但是添加默认的“action”在我的“ApiControllerAction”版本中起作用。想到我在这上面花了多长时间才开始这么做,我很难过:(我刚刚意识到这会破坏任何Put、Post或其他动作:(在这种情况下,您的场景与您所描述的不同……您需要添加额外的路由以支持不同的操作……您知道我将如何使其工作吗?如果我以原始apicontrolly
版本离开,Put、Post等工作正常,但随后我失去了拥有多个“get”的能力)还有一个默认设置。我编辑了我的原始回答,以回答您关于让Put/Post/etc方法工作的问题…哇,我试图让它太复杂了…我必须删除第一条路径才能让它工作,但是是的,为“action”添加默认设置对我的“ApiControllerAction”有效令人难过的是,我花了多长时间才开始这么做:(我刚刚意识到这会破坏任何Put、Post或其他动作:(在这种情况下,您的场景与您所描述的不同……您需要添加额外的路由以支持不同的操作……您知道我将如何使其工作吗?如果我以原始apicontrolly
版本离开,Put、Post等工作正常,但随后我失去了拥有多个“get”的能力)我已经编辑了我的原始回复,以回答您的问题,让Put/Post/etc方法发挥作用。。。