我有一个带有多个GET动作的ApiController。问题是我不想在他们名字的开头没有“获取”来命名我的行为。
例如,我可以有一个名为“GetImage”的Action,它可以正常工作。 如果我将其命名为“UpdateImage”,它将不会调用Action,因为它可能需要在操作名称的开头显示“Get”。
我可以通过为我想要使用的每个动作定义不同的路线来解决它,但我确信必须有一个更简单的方法来实现它。
我也尝试了[HttpGet]属性,不幸的是它没有做到这一点。
我的路线配置:
routes.MapHttpRoute(
name: "ImagesApi",
routeTemplate: "api/images/{action}/{id}",
defaults: new { controller = "ImageStorageManager",id = RouteParameter.Optional }
);
我正在api/images/GetImage
或api/images/UpdateImage
答案 0 :(得分:6)
我创建api控制器的方式不仅适用于单个对象,也可能对您有所帮助。我从John Papa的关于PluralSight的SPA讲座中得到了这个方法(我强烈建议学习单页应用程序)。他还在其中一个模块中介绍了这一点。
它有两部分。
第1部分,设置路线以执行2个正常情景,然后为我想要的内容添加第3个:
// ex: api/persons
routes.MapHttpRoute(
name: ControllerOnly,
routeTemplate: "api/{controller}"
);// ex: api/sessionbriefs
// ex: api/persons/1
routes.MapHttpRoute(
name: ControllerAndId,
routeTemplate: "api/{controller}/{id}",
defaults: null, //defaults: new { id = RouteParameter.Optional } //,
constraints: new { id = @"^\d+$" } // id must be all digits
);
// ex: api/lookups/all
// ex: api/lookups/rooms
routes.MapHttpRoute(
name: ControllerAction,
routeTemplate: "api/{controller}/{action}"
);
第2部分,在lookups控制器中(在John Papa的案例中),为方法添加一个ActionName属性:
// GET: api/lookups/rooms
[ActionName("rooms")]
public IEnumerable<Room> GetRooms()
{
return Uow.Rooms.GetAll().OrderBy(r => r.Name);
}
// GET: api/lookups/timeslots
[ActionName("timeslots")]
public IEnumerable<TimeSlot> GetTimeSlots()
{
return Uow.TimeSlots.GetAll().OrderBy(ts => ts.Start);
}
答案 1 :(得分:2)
使用[HttpGet]装饰你的动作。有关为何以及ApiController路由如何工作的详细信息,请参阅http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api。