WebApi动作路线

时间:2014-04-05 20:07:50

标签: asp.net-mvc asp.net-web-api

我正在尝试在同一个控制器上支持模型上的子操作的多个GET请求,但是我无法使路由正常工作。我想支持 -

/{controller}/{id}/{action}

虽然没有踩到默认

/{controller}/{id}

我尝试创建另一个路由配置 -

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}/{action}"
        );

但是,这允许 / {controller} / {id} / {action} 的路线,但 / {controller} / {id} 方法停止工作通过"找到多个动作"异常。

以下是我试图揭示的三种GET方法的示例 -

    public HttpReponseMessage GetItem() 
    {

    }
    public HttpResponseMessage GetItem(int id)
    {

    }
    public HttpResponseMessage GetItemMetaData(int id)
    {

    }

2 个答案:

答案 0 :(得分:3)

如果您使用的是Web API 2,请尝试使用Attribute Routing,这使得这些情况非常容易处理。如果您仍在Web API 1上,请查看Attribute Routing for Web API。如果由于某种原因您不想使用任何一种,您可以更详细地指定路线,如下所示:

// Map your specific route first.
config.Routes.MapHttpRoute(
    name: "NestedApi",
    routeTemplate: "api/{controller}/{id}/items",
    defaults: new{action = "GetItems"}
);
// You can have other specific routes here.

// Map all other GET requests to a Get method.
config.Routes.MapHttpRoute(
    name: "DefaultGetApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional, action = "Get" },
    constraints: new{httpMethod = new HttpMethodConstraint(HttpMethod.Get)}
);

// Use default route for all the rest.
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

答案 1 :(得分:0)

尝试在SO问题上使用此答案Asp.Net Web API Routing not hitting custom action作为起点。当我在我的应用程序中设计自定义路径时,它对我帮助很大。

为了调试所有自定义路由,我默认使用ASP.NET Web API Route Debugger