ASP.NET MVC 4 - API路由 - 在URL中指定操作

Bud*_*Joe 2 asp.net-mvc asp.net-mvc-4 asp.net-web-api

我有一个用ASP.NET MVC 4框架编写的Web服务.它的基本CRUD操作很好地映射到REST动词,但是我需要添加一个不需要的动作.

指定有时在URL结尾处传递ID的正确方法是什么,你知道它将是一个Integer类型,有时候它是一个"action"一个String类型后跟一个斜杠和一个int ID?需要帮助正确的路由器地图.

思考?注意:我更关注WebAPI然后是100%REST.

示例网址
//获取小部件列表
http://somedomain.com/api/widget
//获取特定小部件
http://somedomain.com/api/widget/1
// POST - 对特定小部件采取特殊操作 - 提升
http://somedomain.com/api/widget/promote/1

这是处理它的正确方法吗?

        routes.MapHttpRoute(  
            name: "DefaultApi",  
            routeTemplate: "api/{controller}/{id}",  
            defaults: new { id = RouteParameter.Optional }  
        );  

        routes.MapHttpRoute(  
            name: "DefaultApiExtended",  
            routeTemplate: "api/{controller}/{action}/{id}"  
        );  
Run Code Online (Sandbox Code Playgroud)

leo*_*eon 5

我尝试将第二个模式(一个"动作",一个字符串类型,后跟一个斜杠和一个int ID)放在一个更高的优先级(在URL的末尾传递一个你知道将是一个整数类型的ID).

routes.MapHttpRoute(
            name: "ActionWithId",
            routeTemplate: "api/widget/{action}/{id}"
        );

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

您的操作和ID不是可选的,因为您总是期待它们.如果没有匹配,DefaultApi规则应该接管处理.

编辑:

想一想,如果你确实希望它是"RESTy",那么你总是可以切换ID,所以对于这个小部件,使用这个id,执行这个动作.

routes.MapHttpRoute(
        name: "ActionWithId",
        routeTemplate: "api/widget/{id}/{action}"
    );
Run Code Online (Sandbox Code Playgroud)