我一直在努力解决这个问题至少4个小时,尝试我能找到的每一个解决方案。
我的主要项目是使用Asp.Net和MVC建立的,它可以很好地路由到项目中的控制器。我正在集成一个库,它暴露了一个在另一个项目中使用ApiControllers的JSON api但我无法让主项目路由到库项目中的任何东西,它只返回一个海峡404。
在我的主项目global.asax中:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{*allaxd}", new { allaxd = @".*\.axd(/.*)?" });
routes.IgnoreRoute("{*less}", new { less = @".*\.less(/.*)?" });
//ignore aspx pages (web forms take care of these)
routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
routes.IgnoreRoute("{resource}.css/{*pathInfo}");
//ControllerBuilder.Current.DefaultNamespaces.Add("Nexus.Controllers");
routes.MapRoute(
"testapi",
"testapi/{controller}/{action}",
new
{
controller = "User",
action = "Get"
},
new[] { "Nexus.Controllers" }
);
routes.MapRoute(
// Route name
"Default",
// URL with parameters
"{controller}/{action}/{id}",
// Parameter defaults
new { controller = "Events", action = "Index", id = "" }
);
}
在我的库项目UserController中:
namespace Nexus.Controllers
{
public class UserController : ApiController
{
public Object Get(string id)
{
var guid = new Guid(id);
var user = crm.Users.Where(x => x.UserId == guid).FirstOrDefault();
return new
{
id = user.UserId,
name = user.UserName,
email = user.Email,
extension = user.Ext,
phone = user.Phone
};
}
}
}
我希望工作的网址都没有: / testapi / testapi /用户 / testapi /用户/ GET / testapi /用户/获取?ID = 1
他们都返回404。
我甚至使用路由调试器来验证路由是否正确设置:
我错过了什么?
答案 0 :(得分:4)
您似乎混淆了标准MVC控制器(派生自System.Web.Mvc.Controller
类)和API控制器(源自System.Web.Http.ApiController
类)。您的UsersController是一个API控制器。
因此,如果要配置Web API路由,则需要使用MapHttpRoute
扩展方法,而不是仅用于标准MVC控制器的MapRoute
。
像这样:
GlobalConfiguration.Configuration.Routes.MapHttpRoute(
name: "testapi",
routeTemplate: "testapi/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
另请注意,在RESTful API中,您未在路径中指定操作名称。它是从用于使用它的HTTP动词中假设的。这是good article
我建议您阅读Web API中的RESTful路由。