我定义了这两条路线:
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)
{
...
}
}
注意事项:
GetVoucherTypesForPartner
Action 采用的参数必须称为 partnerId
而不是 id
以尊重您的路线定义并避免任何混淆 关于c# - Web API 路由被忽略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16194588/