我完全坚持这一点 - 在评论几乎所有与启动配置有关的事情后,只留下以下内容,我仍然无法让WebApi属性路由正常工作。
我有以下Global.asax.cs:
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
以下控制器 - 位于名为“v2”的区域:
[RoutePrefix("v2/businesses")]
public class BusinessesController : ApiController
{
// GET: v2/businesses/{id}
[HttpGet]
[Route("{id:int}")]
public ApiResponse<ApiBusiness> Index(int id)
{
return new ApiResponse<ApiBusiness>(new ApiBusiness());
}
}
以下区域注册:
public class V2AreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "v2";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.MapMvcAttributeRoutes();
}
}
以下WebApiConfig:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
}
}
当我尝试访问端点网址businesses/1
或v2/businesses/1
或v2/v2/businesses/1
时,所有三个都返回404,我确信其中一个是正确的。
请注意,“v2”区域之外的其他控制器可以正常工作:
[RoutePrefix("abc")]
public class TestingController : ApiController
{
[HttpGet]
[Route("123")]
public int Test()
{
return 2;
}
}
当我访问该端点(abc/123
)时,肯定会返回2。
有谁可以解释为什么这不起作用?
答案 0 :(得分:1)
在这种情况下,你说“v2”既是mvc路由又是web api路由;他们无法共存。 我的意思是,他们可以,但这里发生的事情是,对Web API的请求将被错误地处理,就好像它们是MVC动作一样。这就是你得到404的原因。
简而言之,Web API并不真正支持区域。您可以在此处尝试在 mvc路由之前注册web api路由,或使用nil
显式处理Web api rounting。例如:
MapHttpRoute
检查specifications SO答案以获取更多详情!