如何从MVC项目路由到另一个项目中的MVC ApiController?

时间:2013-01-07 15:11:49

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

我一直在努力解决这个问题至少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。

我甚至使用路由调试器来验证路由是否正确设置: routes

我错过了什么?

1 个答案:

答案 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路由。