我花了一些时间来尝试让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
我的帖子也不起作用。
答案 0 :(得分:4)
您的MVC路线优先于您的API路线。因为您正在使用捕获MVC端的所有路由("{controller}/{action}/{id}"
),并且它首先被注册,所以您的路由将始终查找名为api
或hello
的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