当URL中不存在可选参数时,找不到Web API操作

时间:2014-05-08 17:00:44

标签: asp.net-mvc asp.net-mvc-routing asp.net-mvc-5 asp.net-web-api2

请帮忙。 我不得不改变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并不像我想的那么可选。

感谢您的帮助!

1 个答案:

答案 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,则可以使用“属性路由”来简化操作。