Web API路由被忽略

时间:2013-04-24 14:25:06

标签: c# asp.net-mvc-4 asp.net-web-api

我定义了这两条路线:

routes.MapRoute(
    name: "GetVoucherTypesForPartner",
    url: "api/Partner/{partnerId}/VoucherType",
    defaults: new { controller = "Partner", action = "GetVoucherTypesForPartner"}
);

routes.MapRoute(
    name: "Default",
    url: "api/{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional}
);

在我的PartnerProfile控制器中,我有两种方法:

public Partner Get(string id)
{ }

public IEnumerable<string> GetVoucherTypesForPartner(string id)
{ }

如果我点击了网址~/api/Partner/1234,则会按预期调用Get方法。
但是,如果我点击了网址~/api/Partner/1234/VoucherType,则会调用相同的Get方法。我期待我的GetVoucherTypesForPartner被调用。

我很确定路线设置中的某些内容是错误的......

1 个答案:

答案 0 :(得分:2)

您似乎已映射标准MVC路由,而不是Web API路由。有很大的不同。标准路由由派生自Controller类的控制器使用,但如果您使用ASP.NET Web API并且控制器派生自ApiController类型,那么您应该定义HTTP路由。

您应该在~/App_Start/WebApiConfig.cs而不是~/App_Start/RouteConfig.cs内填写。

所以继续:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "GetVoucherTypesForPartner",
            routeTemplate: "api/Partner/{partnerId}/VoucherType",
            defaults: new { controller = "Partner", action = "GetVoucherTypesForPartner" }
        );

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

然后:

public class PartnerController : ApiController
{
    public Partner Get(string id)
    {
        ...
    }

    public IEnumerable<string> GetVoucherTypesForPartner(string partnerId)
    {
        ...
    }
}

需要注意的事项:

  • 我们已经定义了HTTP路由而不是标准的MVC路由
  • 必须将GetVoucherTypesForPartner操作所采用的参数称为partnerId而不是id,以便尊重您的路线定义并避免任何混淆