4

第一条路线有效。

例如api/Shelves/SpaceTypes/1

第二条路线不行。我收到多个操作错误。

例如api/Shelves/1

问)为什么?

这些是我的路线:

config.Routes.MapHttpRoute(
    "DefaultApiWithAction",
    "api/{controller}/{action}/{id}"
);

config.Routes.MapHttpRoute(
    "DefaultApiWithId",
    "api/{controller}/{id}",
    null,
    new { id = @"\d+" }
);

这是我的控制器:

public HttpResponseMessage Get(int id)
{
     ...
}

[ActionName("SpaceTypes")]
public HttpResponseMessage GetSpaceTypes(int id)
{
     ...
}
4

5 回答 5

11

对于 MVC 4.5,这是唯一有效的

目前有一个关于此的错误

为了使您的路由正常工作,请进行以下工作

api/Shelves/ //Get All Shelves
api/SpaceTypes/1 //Get Shelf of id 1
api/Shelves/1/SpaceTypes/  //Get all space types for shelf 1

您需要执行以下操作。

将您的路由更改为。(注意默认操作..)

config.Routes.MapHttpRoute(
    name : "DefaultAPi",
    routeTemplate : "api/{controller}/{id}/{action}",
    defaults: new {id= RouteParameter.Optional, 
    action = "DefaultAction"}
);

在您的控制器中,将基本方法更改为

[ActionName("DefaultAction")]
public string Get()
{
}

[ActionName("DefaultAction")]
public string Get(int id)
{
}

[ActionName("SpaceTypes")]
public string GetSpaceTypes(int id)
{
}

现在一切都应该按预期工作..

感谢 Kip Streithorst 完整的这个,以获得完整的解释

于 2013-06-26T13:41:44.080 回答
4

我有一个类似的问题,发现我没有在我的 WebApiConfig 中调用 MapHttpAttributeRoutes 方法......

希望它有所帮助,大卫

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
于 2014-05-01T08:23:30.903 回答
1

@Kristof 几乎是对的。你应该做你的第二条路线:

config.Routes.MapHttpRoute(
    "DefaultApiWithId", 
    "api/{controller}/{id}",
    new { action = "Get" },
    new { id = @"\d+ }
    );
于 2013-06-26T13:44:00.150 回答
0

此路由不知道要绑定到哪个操作:

config.Routes.MapHttpRoute("DefaultApiWithId", "api/{controller}/{id}", null, new { id = @"\d+" });

您的两种方法都是有效的候选者。
我不是 100% 清楚你的设置是什么,但在正常的 REST 中,每个资源都有一个控制器,看起来你有 1 个控制器和 2 个资源。
要使其在此设置中工作,您可以强制您的第二条路线执行 get 操作,如下所示:

 config.Routes.MapHttpRoute("DefaultApiWithId", "api/{controller}/{id}", null, new { id = @"\d+", action="Get" });
于 2013-06-26T11:56:14.677 回答
0

确保在项目的 Global.asx 文件中添加了

WebApiConfig.Register(GlobalConfiguration.Configuration);

进入 Application_Start 函数。

于 2016-12-30T19:48:07.550 回答