簡體   English   中英

具有ActionNames的MVC4 WebApi路由不允許通用的“ Get”

[英]MVC4 WebApi Routing with ActionNames not allowing for generic “Get”

我一直無法嘗試擁有多個“獲取”方法,同時還具有默認的/ api / {controller}。 這是一個帶有偽代碼的示例(是的,我知道它將返回完全相同的代碼)。

錯誤:當我嘗試轉到/api/courses"Multiple actions were found that match the request"

轉到/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);
}

RouteConfig看起來像:

routes.MapHttpRoute(
       "ApiControllerOnly",
       "api/{controller}"
);

// Allow for numeric Ids to be passed in
routes.MapHttpRoute(
       "ApiControllerAndIntegerId",
       "api/{controller}/{id}",
       null,
       new { id = @"^\d+$" }
);

routes.MapHttpRoute(
       "ApiControllerAction",
       "api/{controller}/{action}"
);

我想要做的是致電:

/api/courses - returns Get()
/api/courses/all - returns GetAll()
/api/courses/3 - returns Get(id = 3)

編輯:

它還需要允許Put,Post等正常工作,例如Putting課程放在/ api / courses /

錯誤:當我嘗試轉到/ api / courses時,“發現多個符合要求的動作”

通過將ApiControllerOnly路由的默認操作指定為“ Get”,我可以使/api/courses正常工作。 這對您的情況有用嗎?

        routes.MapHttpRoute(
            name: "ApiControllerOnly",
            routeTemplate: "api/{controller}",
            defaults: new { action = "Get" }
        );

編輯:

如果APIController中還有其他Put / Post / etc方法,則應考慮在ApiControllerOnly路由上使用HttpMethodConstraint並為Put / Post / etc方法添加另一個路由(即ApiControllerOnly2 ):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM