Asp.net mvc 4 MVC 4.5 Web API路由不工作?

Asp.net mvc 4 MVC 4.5 Web API路由不工作?,asp.net-mvc-4,controller,routing,asp.net-web-api,Asp.net Mvc 4,Controller,Routing,Asp.net Web Api,一号线有效 e、 g.api/sheels/SpaceTypes/1 第二条路线不行。我得到多个动作的错误 e、 gapi/货架/1 Q)为什么? 以下是我的路线: config.Routes.MapHttpRoute( "DefaultApiWithAction", "api/{controller}/{action}/{id}" ); config.Routes.MapHttpRoute( "DefaultApiWithId", "api/{controll

一号线有效

e、 g.
api/sheels/SpaceTypes/1

第二条路线不行。我得到多个动作的错误

e、 g
api/货架/1

Q)为什么?

以下是我的路线:

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)
{
     ...
}

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

config.Routes.MapHttpRoute("DefaultApiWithId", "api/{controller}/{id}", null, new { id = @"\d+" });
您的两种方法都是有效的候选方法
我不是100%清楚您的设置是什么,但在正常的REST中,每个资源都有一个控制器,似乎您有一个控制器和两个资源。
要使其在此设置中正常工作,您可以强制第二条路径执行以下get操作:

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

对于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
您需要执行以下操作

将您的路线改为。(请注意默认操作…)

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

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

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

[ActionName("SpaceTypes")]
public string GetSpaceTypes(int id)
{
}
现在一切都应该按预期进行了


多亏了Kip Streithorst full,克里斯托夫几乎是对的。你应该选择第二条路线:

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

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

希望有帮助, 大卫


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

WebApiConfig.Register(GlobalConfiguration.Configuration);

进入应用程序启动功能。

谢谢,但这不起作用。我在一个控制器上没有两种资源类型。我有一个单一的资源类型,用另一种方法通过id获取关于该资源的子信息。谢谢,我希望有一天能见到你,并亲自向你表示感谢
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 }
        );
    }
}
WebApiConfig.Register(GlobalConfiguration.Configuration);