C# 带有ActionNames的MVC4 WebApi路由不允许通用;获得;

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); }

我在尝试使用多个“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);
}

// 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方法发挥作用。。。