我定义了这两条路线:

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 Controller 中,我有两种方法:
public Partner Get(string id)
{ }

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

如果我点击 url ~/api/Partner/1234 然后,正如预期的那样,将调用 Get 方法。
但是,如果我点击 url ~/api/Partner/1234/VoucherType 然后调用相同的 Get 方法。我期待我的 GetVoucherTypesForPartner 被调用。

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

最佳答案

您似乎已经映射了标准 MVC 路由,而不是 Web API 路由。有很大的不同。标准路由由派生自 Controller 类的 Controller 使用,但如果您使用的是 ASP.NET Web API 并且您的 Controller 派生自 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 Action 采用的参数必须称为 partnerId 而不是 id 以尊重您的路线定义并避免任何混淆
  • 关于c# - Web API 路由被忽略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16194588/

    10-12 00:26
    查看更多