ApiController GET动作命名

Avi*_*hen 1 api asp.net-mvc asp.net-routing asp.net-web-api

我有一个带有多个GET动作的ApiController.问题是我不想在他们名字的开头没有"获取"来命名我的行为.

例如,我可以有一个名为"GetImage"的Action,它可以正常工作.如果我将其命名为"UpdateImage",它将不会调用Action,因为它可能需要在动作名称的开头显示"Get".

我可以通过为我想要使用的每个动作定义不同的路径来解决它,但我相信必须有一个更容易的方法来实现它.

我也试过[HttpGet]属性,不幸的是它没有做到这一点.

我的路线配置:

    routes.MapHttpRoute(
        name: "ImagesApi",
        routeTemplate: "api/images/{action}/{id}",
        defaults: new { controller = "ImageStorageManager",id = RouteParameter.Optional }
    );
Run Code Online (Sandbox Code Playgroud)

我正在通过api/images/GetImage或访问它api/images/UpdateImage

Jas*_*ley 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}"
        );
Run Code Online (Sandbox Code Playgroud)

第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);
    }
Run Code Online (Sandbox Code Playgroud)