无法启用/正在运行Web API属性路由

时间:2014-12-15 21:32:25

标签: asp.net asp.net-mvc asp.net-web-api asp.net-web-api-routing

我花了一些时间来尝试让Web API属性路由正常工作,无论我尝试什么,我得到的都是404错误。

我有一个简单的ApiController尝试在api/hello/{number}hello/{number}定义HttpGet:

public class HelloController : ApiController
{
    public class Hello
    {
        public string user { get; set; }
        public string password { get; set; }
    }

    [Route("api/hello/{number}")]
    [Route("hello/{number}")]
    [HttpGet]
    public IEnumerable<Hello> GetStuff(int number)
    {
        var response = Request.CreateResponse(HttpStatusCode.Created, number);
        return null;
    }

    [Route("api/hello")]
    [HttpPost]
    public HttpResponseMessage PostHello(Hello value) 
    {
        var response = Request.CreateResponse(HttpStatusCode.Created, value);
        return response;
    }
}

我将此作为我的RouteConfig,启用属性路由:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapMvcAttributeRoutes();

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

WebAPIConfig:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
    }
}

最后,这是我的Application_Start(),我注册了WebApiConfig:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }

有人看到我失踪的东西吗?我得到404错误(无法在GetStuff()中遇到断点)以下所有内容:

  • http://localhost/api/hello
  • http://localhost/api/hello/1
  • http://localhost/hello
  • http://localhost/hello/2

我的帖子也不起作用。

2 个答案:

答案 0 :(得分:4)

您的MVC路线优先于您的API路线。因为您正在使用捕获MVC端的所有路由("{controller}/{action}/{id}"),并且它首先被注册,所以您的路由将始终查找名为apihello的mvc控制器,因为这是它匹配的路线。

尝试在您的Global.asax中将您的api注册移到MVC路由注册之上:

GlobalConfiguration.Configure(WebApiConfig.Register);
//then
RouteConfig.RegisterRoutes(RouteTable.Routes);

答案 1 :(得分:1)

在班级设置路线前缀。然后在功能级别设置路线。

[RoutePrefix("api/hello")]
public class HelloController : ApiController
{
    [Route("getstuff/{number}")]
    public IEnumerable<Hello> GetStuff(int number)
    {
    }
}

然后拨打/api/hello/getstuff/1