请帮忙。 我不得不改变Web API的路由,以便能够使用URL中的方法:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// for MVC controllers
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Editions", action = "Index", id = UrlParameter.Optional }
);
// for Web API
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
我有一个控制器
public class PositionsController : ApiController
{
[HttpGet]
public JToken Approved()
{
// some code here
}
}
对于带参数的方法,一切正常,但我不能调用像http://localhost/API/Positions/Approved
这样的无参数方法。而不是调用Approved
方法我得到404找不到错误。我做错了什么?
有趣的部分:调用网址http://localhost/API/Positions/Approved/whatever
有效。似乎ID并不像我想的那么可选。
感谢您的帮助!
答案 0 :(得分:4)
您的问题是第一条路线(MVC)正在匹配,而不是您实际想要的路线。
因此对于像http://localhost/API/Positions/Approved
这样的网址,该应用正在寻找一个名为“APIController”的控制器,其中一个名为“Positions”的动作带有一个字符串参数“id”,该值将设置为“已批准”。
快速解决方案是更改路由的声明,以便API路由出现在MVC路由之前,但是如前所述,我将路由分成各自的配置(RouteConfig& WebApiConfig)并确保在Global中。 asax.cs路由以正确的顺序注册:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
或者,如果您使用的是WebApi2,则可以使用“属性路由”来简化操作。